Ошибка NullPointerException при использовании ModelDriven
У меня есть два класса, как следующие
Address
int ID
int unit
String street
User
int ID
String Name
Address address
мой пользовательский класс
public class user{
.....
private Address address;
...getters setters...
}
Как показано выше, класс User содержит объект класса Address. Мой код должен получать значения формы и показывать их на консоли.
Но когда я пытаюсь получить доступ к атрибуту модуля класса адреса, он показывает следующую ошибку.
"SEVERE: во время обработки запроса возникла исключительная ситуация: null java.lang.NullPointerException"
мой контроллер
@Action
class myclass implements ModelDriven{
private User user = new User();
public Register(){
System.out.println("User's Unit" + user.getAddress().getUnit()); // error is on this line
}
@Override
public Object getModel() {
return user;
}
JSP файл
<s:form action="Register">
<s:textfield name="name" label="Name"/>
<s:textfield name="unit" label="Unit"/>
<s:textfield name="block" label="Block"/>
</s:form>
5 ответов
Сделать следующий помощник
<s:textfield name="address.unit" label="Unit"/>
Попробуйте этот класс действий, это будет определенно работать
public class myclass extends ActionSupport implements ModelDriven<User>, Preparable{
private User user = new User();
@Override
public void prepare() throws Exception {
user=new User();
}
@Override
public User getModel() {
return user;
}
public Register(){
System.out.println("User's Unit" + user.getAddress().getUnit());
}
}
и изменить JSP
<s:textfield name="address.unit" label="Unit"/>
для установки только свойства объекта
<s:textfield name="name" label="Name"/>
Здесь struts2 будет искать свойство name="name" в связанных DTO в вашем соответствующем действии, но стеку значений не удастся найти свойство с именем "name" в вашем действии, потому что вы создали другой класс bean-компонента Address, который имеет имя участника". Таким образом, вы должны сообщить элементу формы, что экземпляр "name" находится в другом POJO, т.е. в Adderess. Так что внесите изменения следующим образом:
<s:textfield name="address.name" label="name"/>
Проблема в том, что я вижу, вы не new
d address
объект
address = new Address();
в конструкторе User
учебный класс.
Похоже, что при создании объекта пользователя с помощью "private User user = new User()" адресный объект пользователя не инициализируется. Поскольку user.getAddress () имеет значение null, при попытке вызвать user.getAddress(). GetUnit() это приведет к исключению нулевого указателя.