Ошибка 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"/>

Проблема в том, что я вижу, вы не newd address объект

address = new Address(); в конструкторе User учебный класс.

Похоже, что при создании объекта пользователя с помощью "private User user = new User()" адресный объект пользователя не инициализируется. Поскольку user.getAddress () имеет значение null, при попытке вызвать user.getAddress(). GetUnit() это приведет к исключению нулевого указателя.

Другие вопросы по тегам