Как получить атрибут в качестве значения выражения от контроллера? - PullRequest
0 голосов
/ 02 августа 2011

Я получаю это исключение:

javax.el.PropertyNotFoundException: свойство 'message' не найдено в введите com.itworx.twitter.model.User

когда я пытаюсь запустить этот код с моего контроллера:

@RequestMapping(value="/profile", method=RequestMethod.GET)
    public ModelAndView goProfile(@ModelAttribute("user") User user){
        if(user != null){
            ModelAndView modelAndView = new ModelAndView("profile-layout");
            List< Message> messages=service.getUserMessages(user.getUsername());
            /*user.setMessages(messages);*/
            /*modelAndView.addObject("user",user);*/
            modelAndView.addObject("userMessages",messages);
            return modelAndView;
        }else{
            return new ModelAndView("register-layout");
        }

    }

пользовательский компонент выглядит так:

    @Entity
@Table(name="user")
public class User implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -5689970869179555442L;

    @Id
    @Column(name="username")
    /*@NotNull*/
    private String username;

    @Column(name="password")
    private String password;

    @Column(name="email")
    /*@Email*/
    private String email;

    @ManyToMany
    @JoinTable(name="user_follower",joinColumns={@JoinColumn(name="username")},
            inverseJoinColumns={@JoinColumn(name="follower")})
    private List<User> followers = new ArrayList<User>(0);

    /*@LazyCollection(LazyCollectionOption.FALSE)*/
    @OneToMany
    @JoinTable(name="user_message",joinColumns={@JoinColumn(name="username")},
            inverseJoinColumns={@JoinColumn(name="message_date")})
    @OrderBy(value="messageDate")
    private List<Message> messages = new ArrayList<Message>(0);

    public User() {

    }

    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setUserFollowers(List<User> followers) {
        this.followers = followers;
    }

    public List<User> getUserFollowers() {
        return followers;
    }

    public void setMessages(List<Message> messages) {
        this.messages = messages;
    }

    public void addMessage(Message message){
        this.messages.add(message);
    }

    public List<Message> getMessages() {
        return messages;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

и реализация dao выглядит следующим образом:

public List<Message> getUserMessage(String username) {
        session=sessionFactory.getCurrentSession();
        @SuppressWarnings("unchecked")
        List<Message> messages=session.createCriteria(User.class).setFetchMode("messages", FetchMode.JOIN)
        .add(Restrictions.eq("username", username)).list();
        return messages;
    }

страница выглядит так:

<body>
    <table id="feeds" style='width: 100%'>
    <tr></tr>
    </table>
    <table style='width: 100%'>
    <tr></tr>
        <c:forEach var="msg" items="${userMessages}">
            <tr>
                <td>
                    <c:out value="${msg.message}" />
                </td>
            </tr>
            <tr>
                <td>
                    <c:out value='${msg.messageDate}' />
                </td>
            </tr>
        </c:forEach>
    </table>
</body>

1 Ответ

0 голосов
/ 09 августа 2011

Извините, этому ответу неделя, поэтому вы, наверное, поняли это, но я думаю, что проблема в вашей реализации DAO.Эта строка:

List<Message> messages=session.createCriteria(User.class)
        .setFetchMode("messages", FetchMode.JOIN)
        .add(Restrictions.eq("username", username)).list();

На самом деле собирается вернуть вам список User объектов с инициализированной коллекцией messages.

Изменение метода DAO на это:

session=sessionFactory.getCurrentSession();
@SuppressWarnings("unchecked")
User userWithMessages=session.createCriteria(User.class)
        .setFetchMode("messages", FetchMode.JOIN)
        .add(Restrictions.eq("username", username)).uniqueResult();
return userWithMessages.getMessages();

должен дать вам (и, вероятно, уже дал) то, что вы ищете.

...