简体   繁体   中英

Java,Spring Map one value from class to value from another class

I'm new to Spring framwork in Java. And have some problems...
My app use spring, spring sequrity, hibernate frameworks.
I'm writing some simple application.
I has a page where users can be added through hibernate to db.
User class:

@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;
    }
}

Role class:

@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;
}
}

Saving in controller:

@RequestMapping(value = "/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/";
}

Saving in UserDAO

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

        session.save(user);

    } catch (Exception e) {

    } finally {

    }
}

I have a select block on page where i can chose a user role as a string.
so when saving a user i've got

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)

So as I understand I should create a bean in configuration witch helps spring framework to map convertion from string to Role objects? Can someone help me to resolve this error?

Try to add BindingResult bindingResult after @ModelAttribute("user")User user in addUser method.

so, your addUser method is going to be like :

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/";
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM