2013-02-13 2 views
1

У меня есть два класса следующим образомошибка 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 имеет объект адреса класса в нем. Ожидается, что мой код получит значения формы и покажет их на консоли.

Но когда я пытаюсь получить доступ к атрибуту unit класса адресов, он показывает следующую ошибку.

"СИЛЬНЫЙ: Исключение произошло во время обработки запроса: нулевой 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> 
+0

где именно делать вы хотите использовать свои атрибуты OTHER? – SudoRahul

+0

@ R.J Мне нужно иметь доступ к ним в моем контроллере, чтобы отправить их в мою модель для сохранения в базе данных. –

+0

** System.out.println («User Unit» + user.getAddress(). GetUnit()); ** - вы уже использовали его. Ваш вопрос все еще слишком расплывчатый. – SudoRahul

ответ

2

сделать следующий родственную

<s:textfield name="address.unit" label="Unit"/> 
0

Проблема, как я вижу это , у вас нет new d address объект

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

0

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

1
<s:textfield name="name" label="Name"/> 

Здесь struts2 будет искать name = "name" Свойство в соответствующих DTO в вашем действии, но value-stack не сможет найти свойство с именем "name" в вашем действии, потому что вы создали другой bean-класс Address который имеет имя участника. Итак, вы должны указать свой элемент формы, что «имя» экземпляр находится в разных POJO i.e Adderess. Так что подобные изменения:

<s:textfield name="address.name" label="name"/> 
2

попробовать этот класс действий это будет определенно работать

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()); 
    } 
} 

и изменить СПЯ

<s:textfield name="address.unit" label="Unit"/> 

для установки только обьект