2013-03-06 5 views
2

내가 양식을 통해 내 개체를 업데이트하려고 나는 두 개의 컨트롤러가 : 스프링 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하려고하면이 내부 컬렉션이 비어 있습니다 (폼을 제출할 때 어딘가에 사라집니다).

내 사용자 정의 개체 :

@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

UserDetailsorg.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

+0

손님의 개체를 게시하고 양식을 제출하십시오. – dgregory

+0

내 문제가 지금 최신 상태입니다. – sidlejinks