2013-07-20 45 views
0

我是Java中Spring框架的新手。并有一些问题...
我的应用程序使用spring,spring sequrity,hibernate框架。
我在写一些简单的应用程序。
我有一个页面,用户可以通过休眠添加到数据库。
用户类:Java,Spring将一个值从一个类别转换为另一个类别的值

@Entity 
@Table(name="users") 
public class User 
{ 
    @Id 
    @GeneratedValue 
    private Integer id; 

    private String login; 

    private String password; 

    @OneToOne(cascade=CascadeType.ALL) 
    @JoinTable(name="user_roles", 
     joinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")}, 
     inverseJoinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")} 
    ) 
    private Role role; 


    private Integer moneyCount; 

    public Integer getId() { 
     return id; 
    } 

    public void setId(Integer id) { 
     this.id = id; 
    } 

    public String getLogin() { 
     return login; 
    } 

    public void setLogin(String login) { 
     this.login = login; 
    } 

    public String getPassword() { 
     return password; 
    } 

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

    public Role getRole() { 
     return role; 
    } 

    public void setRole(Role role) { 
     this.role = role; 
    } 

    public Integer getMoneyCount() { 
     return moneyCount; 
    } 

    public void setMoneyCount(Integer moneyCount) { 
     this.moneyCount = moneyCount; 
    } 
} 

角色类:

@Entity 
@Table(name="roles") 
public class Role { 

@Id 
@GeneratedValue 
private Integer id; 

private String role; 

@OneToMany(cascade=CascadeType.ALL) 
@JoinTable(name="user_roles", 
    joinColumns = {@JoinColumn(name="role_id", referencedColumnName="id")}, 
    inverseJoinColumns = {@JoinColumn(name="user_id", referencedColumnName="id")} 
) 
private Set<User> userRoles; 

@Override 
public int hashCode() { 
    return new Long(id).hashCode(); 
} 

@Override 
public boolean equals(Object obj) { 
    if (obj == null) { 
     return false; 
    } 
    if (! (obj instanceof Role)) { 
     return false; 
    } 
    return this.id == ((Role)obj).getId(); 
} 


public Integer getId() { 
    return id; 
} 

public void setId(Integer id) { 
    this.id = id; 
} 

public String getRole() { 
    return role; 
} 

public void setRole(String role) { 
    this.role = role; 
} 

public Set<User> getUserRoles() { 
    return userRoles; 
} 

public void setUserRoles(Set<User> userRoles) { 
    this.userRoles = userRoles; 
} 
} 

保存在控制器:

@RequestMapping(value = "https://stackoverflow.com/users/add", method = RequestMethod.POST) 
public String addUser(@ModelAttribute("user")User user) { 
    user.setPassword(StatickHelpers.md5(user.getPassword())); 
    user.setId(15); // if remove this line i'll recive user fild id null exception 
    userDAO.addUser(user); 
    return "redirect:/users/"; 
} 

保存在UserDAO的

@Transactional 
public void addUser(User user) 
{ 
    Session session = null; 
    try { 
     session = openSession(); 

     session.save(user); 

    } catch (Exception e) { 

    } finally { 

    } 
} 

我有PAG一个选择块e我可以在其中选择用户角色作为字符串。
所以保存用户时,我已经得到了

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.validation.BindException: 

org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'user' on field 'role': rejected value [ROLE_EMPLOYER]; codes [typeMismatch.user.role,typeMismatch.role,typeMismatch.com.sprsec.model.Role,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.role,role]; arguments []; default message [role]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'com.sprsec.model.Role' for property 'role'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.sprsec.model.Role] for property 'role': no matching editors or conversion strategy found] 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 

所以,按照我的理解,我应该创建配置女巫豆有助于Spring框架从字符串皈依映射到角色的对象? 有人可以帮我解决这个错误吗?

+0

春季通常有弦乐<->枚举之间的良好转换(它永远只是为我工作)。需要更多的信息来提供完整的建议(Spring版本,enum的定义)。这应该提供信息并包含一个链接回到Spring文档:http://www.captaindebug.com/2011/06/using-spring-3-converterfactory.html#.UeqSAReKklI用于实现转换器。 或者,您可以尝试创建一个重载的setter,它接受一个String arg并设置枚举。 –

+0

在我的实现角色是一个类。代码提供以上 –

+0

对不起,假设不好。你需要一个自定义的转换器(链接应该足以提供信息)或重载的setter。作为一个角色与用户之间的联系是有问题的。如果您使用的是Spring,如果您将在项目中使用它,可能还需要考虑与角色/权限的Spring Security概念进行集成。 –

回答

0

尝试在@ModelAttribute("user")User user之后在addUser方法中添加BindingResult bindingResult

所以,你ADDUSER方法将是这样的:

public String addUser(@ModelAttribute("user")User user, BindingResult bindingResult) { 
    user.setPassword(StatickHelpers.md5(user.getPassword())); 
    user.setId(15); // if remove this line i'll recive user fild id null exception 
    userDAO.addUser(user); 
    return "redirect:/users/"; 
} 
+0

这没有帮助 –

+0

错误是一样的吗? –

+0

是的错误是一样的 –

相关问题