2013-03-06 60 views
2

我尝试通过的形式来更新我的目标,我有两个控制器:Spring MVC的形式更新对象

@RequestMapping(value = "/modifyUser{id}", method = RequestMethod.GET) 
public String modifyUser(@PathVariable("id") int userId, ModelMap map) { 
    UserDetails user = userService.findById(userId); 

    List<CompanyDetails> companyDetailsList = companyService.getAllExceptUsers(userId); 
    map.addAttribute("userDetails", user); 
    map.addAttribute("companiesList",companyDetailsList); 
    return "admin/modify_user"; 
} 

@RequestMapping(value = "/modifyUser", method = RequestMethod.POST) 
public String modifyUser(@Valid @ModelAttribute("userDetails") UserDetails userDetails, 
          BindingResult result, RedirectAttributes redirectAttributes, 
          @RequestParam("company_id")String companyId,ModelMap map) { 
    if (!userService.isPhoneNumbersListValid(userDetails.getPhoneNumbers())){ 
     result.rejectValue("phoneNumbers", "userDetails.phoneNumbersList.error"); 
    } 
    if(!userDetails.getPasswordConfirmation().equals(userDetails.getPassword())){ 
     result.rejectValue("passwordConfirmation","userDetails.passwordConfirmation.error"); 
    } 
    if("default".equals(userDetails.getCountry())){ 
     result.rejectValue("country","userDetails.country.error"); 
    } 
    if (result.hasErrors()){ 
     List<CompanyDetails> companyDetailsList = companyService.getAllExceptUsers(userDetails.getId()); 
     map.addAttribute("companiesList",companyDetailsList); 
     return "admin/modify_user"; 
    } 

    logger.warn("***********Updated user ID:"+userDetails.getId()+" and companies size: "+userDetails.getUserCompanies().size()); 

    CompanyDetails companyDetails = companyService.getCompanyById(Integer.parseInt(companyId)); 
    userDetails.setEnabled(true); 

    if (userService.update(userDetails,companyDetails)) { 
     redirectAttributes.addFlashAttribute("userModifyStatus", true); 
    } else { 
     redirectAttributes.addFlashAttribute("userModifyStatus", false); 
    } 
     return "redirect:modifyUser" + userDetails.getId() + ".html"; 
    } 

UserDetails(这是我的自定义用户对象,不是org.springframework.security.core.userdetails )实体拥有一系列公司,当我们第一次获得页面时,收集已满(如有必要)。

但是当我尝试POST POST更新的对象时,这个内部集合是空的(当我提交表单时它会消失)。

我的自定义对象:

@Entity 
@Table(name = "users") 
public class UserDetails { 

    @Id 
    @GeneratedValue 
    @Column(name = "user_id") 
    private int id; 

    @Column(name = "first_name") 
    @NotEmpty 
    @Size(min = 2, max = 20) 
    private String firstName; 

    @Column(name = "legal_name") 
    @NotEmpty 
    @Size(min = 2, max = 30) 
    private String legalName; 

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

    @Column(name = "legal_address") 
    @NotEmpty 
    @Size(min = 5, max = 255) 
    private String legalAddress; 

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

    @Column(name = "login") 
    @NotEmpty 
    @Email 
    private String login; 

    @Column(name = "password") 
    @NotEmpty 
    @Size(min = 3, max = 10) 
    private String password; 

    @Transient 
    private String passwordConfirmation; 

    @Column(name = "enabled") 
    private boolean enabled; 

    @ElementCollection 
    @CollectionTable(name = "users_phone_numbers", joinColumns = @JoinColumn(name = "user_id")) 
    @Column(name = "phoneNumber") 
    private Collection<String> phoneNumbers = new LinkedList(); 

    @ManyToMany(cascade = CascadeType.REFRESH) 
    @JoinTable(name = "users_companies", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "company_id")) 
    private Set<CompanyDetails> userCompanies = new HashSet(); 

    //getters and setters 
} 

而且我的提交形式:

<form:form method="post" action="modifyUser.html" commandName="userDetails"> 
     <form:hidden path="id"/> 
     <form:label path="firstName"><spring:message code="addUser.label.firstName"/></form:label> 
     <form:input type="text" path="firstName"/> 
     <form:errors path="firstName" cssClass="form-errors"/> 

     <form:label path="legalName"><spring:message code="addUser.label.legalName"/></form:label> 
     <form:input type="text" path="legalName"/> 
     <form:errors path="legalName" cssClass="form-errors"/> 

     <form:label path="login"><spring:message code="addUser.label.login"/></form:label> 
     <form:input type="text" path="login"/> 
     <form:errors path="login" cssClass="form-errors"/> 

     <form:label path="password"><spring:message code="addUser.label.password"/></form:label> 
     <form:input type="password" path="password"/> 
     <form:errors path="password" cssClass="form-errors"/> 

     <form:label path="passwordConfirmation"><spring:message code="addUser.label.confirmPassword"/></form:label> 
     <form:input type="password" path="passwordConfirmation"/> 
     <form:errors path="passwordConfirmation" cssClass="form-errors"/> 

     <form:label path="country"><spring:message code="addUser.label.country"/></form:label> 
     <form:select class="iso-country-select" path="country"> 
      <form:option value="default"><spring:message code="addUser.label.selectCountry"/></form:option> 
     </form:select> 
     <form:errors path="country" cssClass="form-errors"/> 


     <label for="select-companies"><spring:message code="assignUser.label.companies"/> </label> 
     <select id="select-companies" name="company_id"> 
      <option value="default"><spring:message code="searchUser.label.selectCompany"/></option> 
      <c:forEach items="${companiesList}" var="company"> 
       <option value="${company.id}">${company.name}</option> 
      </c:forEach> 
     </select> 

     <div class="phone-numbers"> 
      <form:label path="phoneNumbers"><spring:message code="addUser.label.phoneNumber"/></form:label> 
      <p class="added-input-text"> 
       <c:forEach items="${userDetails.phoneNumbers}" var="phoneNumber" varStatus="loop"> 
        <form:input type="text" path="phoneNumbers[${loop.index}]"/> 
       </c:forEach> 
       <a href="#" class="add"><img src="../static/img/add.png"/></a> 
      <p/> 

      <form:errors path="phoneNumbers" cssClass="form-errors"/> 
     </div> 

     <form:label path="legalAddress"><spring:message code="addUser.label.legalAddress"/></form:label> 
     <form:textarea path="legalAddress"/> 
     <form:errors path="legalAddress" cssClass="form-errors"/> 

     <form:label path="role"><spring:message code="addUser.label.role"/></form:label> 
     <form:select path="role"> 
      <form:option value="ROLE_USER"><spring:message code="addUser.label.role.external"/></form:option> 
      <form:option value="ROLE_ADMIN"><spring:message code="addUser.label.role.internal"/></form:option> 
     </form:select> 

     <input type="submit" value="<spring:message code="modifyUser.label.submit"/>"/> 
    </form:form> 

我能解决这个问题?谢谢。

回答

0

您的意思是UserDetails in org.springframework.security.core.userdetails

在这种情况下,UserDetails中的GrantedAuthority集合没有setter,因此spring mvc无法为此设置值。

public interface UserDetails extends Serializable { 

    Collection<GrantedAuthority> getAuthorities(); 
    .... 
} 


/* it does not have any setter */ 
public interface GrantedAuthority extends Serializable { 
    String getAuthority(); 
} 
+0

哦,不!对不起,我分别更新了我的问题。 – sidlejinks 2013-03-06 15:28:31

+0

请张贴您的custome对象并提交表格。 – dgregory 2013-03-06 15:30:43

+0

我现在的问题是最新的。 – sidlejinks 2013-03-06 15:39:38