(удаление комментариев и добавление их в качестве ответа)
Поскольку у вас установлена анаконда, попробуйте следующее:
conda install pyserial
or
conda install -c conda-forge pyserial
Основная причина этой проблемы заключается в том, что ваш пункт установка этого модуля в отдельном месте или на другую версию питона на вашем компьютере. И вы используете Python, возможно, на Jupyter или в какой-то другой IDE, которая работает через Anaconda. Таким образом, используя вышеизложенную установку conda, все зависимости будут установлены в нужной папке континуума, откуда модули IDE conda получают модули. Нет, вам не нужно ничего удалять, просто введите команду выше в cmd, и она должна работать.
PropertyModel
сделает то, что Вы уже хотите. Когда a PropertyModel
запрашивается для его значения, это смотрит в двух местах:
Если метод "метода считывания" существует для данного свойства, PropertyModel
называет метод считывания для получения значения свойства. А именно, PropertyModel
ищет названный метод get<Property>
, где <Property>
выражение свойства, переданное PropertyModel
конструктор и вызовы метод с помощью отражения, если это существует.
Если никакой метод "метода считывания" не существует, PropertyModel
возвращает значение поля свойства непосредственно. А именно, PropertyModel
использует отражательную находку поле, которое соответствует выражению свойства, переданному PropertyModel
конструктор. Если поле соответствия найдено, PropertyModel
возвращает значение поля. Обратите внимание что PropertyModel
проверит частные и защищенные поля в дополнение к общедоступным полям для соответствия.
В Вашем случае, выражение свойства, используемое в PropertyModel
конструктор "password"
, так PropertyModel
будет сначала искать метод на user
объект называют getPassword
. Если никакой такой метод не существует, PropertyModel
возвратит значение частного password
поле вместо этого.
С тех пор в Вашем случае PropertyModel
возвращает значение частного поля вместо того, чтобы назвать "метод считывания", Вы, скорее всего, ввели название с опечаткой метода считывания в Вашем User
класс. Например, f Вы случайно ввел getPasssword
(с 3 с), PropertyModel
не найдет его, и будет нейтрализация к возврату частного поля.
Править
Если Вам не нравится PropertyModel
поведение по умолчанию, можно создать подкласс PropertyModel
это будет препятствовать тому, чтобы Калитка пробовала к чтению-записи к частным полям. Таким образом, можно вынудить все доступы свойства произойти через методы считывания и методы set.
Я записал пример BeanPropertyModel
класс для демонстрации этого:
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.model.PropertyModel;
/**
* A custom implementation of {@link org.apache.wicket.model.PropertyModel}
* that can only be bound to properties that have a public getter or setter method.
*
* @author mspross
*
*/
public class BeanPropertyModel extends PropertyModel {
public BeanPropertyModel(Object modelObject, String expression) {
super(modelObject, expression);
}
@Override
public Object getObject() {
if(getPropertyGetter() == null)
fail("Missing getter");
return super.getObject();
}
@Override
public void setObject(Object modelObject) {
if(getPropertySetter() == null)
fail("Missing setter");
super.setObject(modelObject);
}
private void fail(String message) {
throw new WicketRuntimeException(
String.format("%s. Property expression: '%s', class: '%s'.",
message,
getPropertyExpression(),
getTarget().getClass().getCanonicalName()));
}
}
большой ответ микрофоном spross! одно маленькое дополнение, хотя:
я не использовал бы модель свойства в этом случае. просто запишите
new Model<String>(){ getObject(){...} setObject(){...}}
и реализуйте корректное поведение, которое делает точно, что Вы хотите.