Java、Spring将类中的一个值映射到另一个类中的值

Java、Spring将类中的一个值映射到另一个类中的值,java,spring,spring-mvc,Java,Spring,Spring Mvc,我不熟悉Java中的Spring framwork。还有一些问题… 我的应用程序使用spring、spring Security和hibernate框架。 我正在写一些简单的应用程序。 我有一个页面,用户可以通过hibernate添加到db中。 用户类别: @Entity @Table(name="users") public class User { @Id @GeneratedValue private Integer id; private String

我不熟悉Java中的Spring framwork。还有一些问题…
我的应用程序使用spring、spring Security和hibernate框架。
我正在写一些简单的应用程序。
我有一个页面,用户可以通过hibernate添加到db中。
用户类别:

@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;
}
}
在UserDAO中保存

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

        session.save(user);

    } catch (Exception e) {

    } finally {

    }
}
我在页面上有一个选择块,可以在其中选择用户角色作为字符串。
所以当我保存一个用户时

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)
所以据我所知,我应该在配置中创建一个bean,帮助spring框架映射从字符串到角色对象的转换?
有人能帮我解决这个错误吗?

尝试在
addUser
方法中的
@modeldattribute(“user”)user-user
之后添加
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/";
}

Spring通常在字符串Enum之间有很好的转换(它总是适合我)。需要更多的信息来提供完整的建议(Spring版本,枚举的定义)。这将提供信息,并包含一个指向Spring文档的链接:用于实现转换器。或者,您可以尝试创建一个重载setter,该setter接受字符串arg并设置枚举。在我的实现中,角色是一个类。上面提供的代码对不起,错误的假设。您将需要一个自定义转换器(链接仍应足以提供信息)或重载的setter。将角色附加到用户的关联作为旁白是值得怀疑的。如果您使用Spring,您可能还想考虑在项目中使用Spring安全概念的角色/权限。
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/";
}