2014-10-13 4 views
1

나는 사용자 만들기위한 몇 가지 형태가 있습니다어느 쪽도하지 BindingResult도 'userCreateForm'을 사용할 수 요청 속성으로 콩 이름에 대한 일반 대상 객체

   <form:form action="${pageContext.request.contextPath}/user/create" method="post" modelAttribute="userCreateForm" autocomplete="off"> 
        <table class="b-table table table-striped"> 
         <tbody> 

          <tr> 
           <td><spring:message code="UI.Labels.User.FirstName"/></td> 
           <td> 
            <form:input type="text" path="firstName" cssClass="form-control"/> 
           </td> 
          </tr> 
          <tr> 
           <td><spring:message code="UI.Labels.User.LastName"/></td> 
           <td> 
            <form:input type="text" path="lastName" cssClass="form-control"/> 
           </td> 
          </tr> 
          <tr> 
           <td><spring:message code="UI.Labels.User.Role"/></td> 
           <td> 
            <form:select path="userRole" cssClass="form-control"> 
             <form:options items="${roles}"/> 
            </form:select> 
           </td> 
          </tr> 

          <tr> 
           <td><spring:message code="UI.Labels.User.Email"/></td> 
           <td> 
            <form:input type="text" path="email" cssClass="form-control" autocomplete="off"/><span><form:errors path="email" cssClass="error"/></span> 
           </td> 
          </tr> 

          <tr> 
           <td><spring:message code="UI.Labels.User.Password"/></td> 
           <td> 
            <form:input type="password" path="password" cssClass="form-control" autocomplete="off"/><span></span> 
           </td> 
          </tr> 

          <tr> 
           <td><spring:message code="UI.Labels.User.Pictire"/></td> 
           <td> 
            <input type="file" name="file" cssClass="form-control"/><span></span> 
           </td> 
          </tr> 
         </tbody> 
        </table> 

        <button class="btn btn-primary" type="submit" name="submit"> 
         <spring:message code="UI.Labels.User.Submit"/> 
        </button> 

       </form:form> 

컨트롤러 :

@RequestMapping("/create") 
public String createPage(Model model, Principal principal, Locale locale) { 
    final User loggedUser = getLoggedUser(); 

    User userCreateForm = new User(); 
    model.addAttribute("userCreateForm", userCreateForm); 
    //model.addAttribute("roles", Utils.localizedRoles(loggedUser.getUserRole(), messageSource, locale)); 
    model.addAttribute("roles", systemRoleService.findAll()); 
    return "user/create"; 
} 

@RequestMapping(value = "/create", method = RequestMethod.POST) 
public String create(
        @ModelAttribute User userForm, 
     BindingResult bindingResult, 
     Model model, 
     Locale locale, 
     RedirectAttributes redirectAttributes) { 
    if(bindingResult.hasErrors()) { 
     return "user/create"; 
    } 
    try { 
     userForm.setPassword(Utils.bcrypt(userForm.getPassword())); 
     userForm.setLogin(userForm.getEmail()); 

     userService.create(userForm); 
     redirectAttributes.addFlashAttribute("success", messageSource.getMessage("UI.Messages.User.CreatedSuccess", null, locale)); 
    } catch (ResourceException ue) { 
     final User loggedUser = getLoggedUser(); 
     final List<String> failures = new ArrayList<>(); 
     for(String m : ue.getMessages()) failures.add(messageSource.getMessage(m, null, locale)); 
     model.addAttribute("failures", failures); 
     model.addAttribute("userCreateForm", userForm); 
     model.addAttribute("roles", Utils.localizedRoles(loggedUser.getUserRole(), messageSource, locale)); 
     return "user/create"; 
    } 
    return "redirect:/"; 
} 

것은 내가 선택하지 않은 경우를 모든 역할 - 잘 작동하지만 역할없이 사용자를 저장하십시오.

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'userCreateForm' available as request attribute 

는이 문제를 해결하기 위해 도와주세요 - 나는 .jsp를 누르십시오 '저장'에서 userRole을 선택하면 나는 오류가 있습니다. 뭐가 잘못 됐는지 말해 줄 수 있겠 니?

역할을 선택한 경우 @ModelAttribute에서 사용자 대신 SystemRole 개체가 표시됩니다. 왜 ...?

지금 나는 새로운 오류가있어 다음 제출 'userRole를'객체

Field error in object 'userCreateForm' on field 'userRole': rejected value [6]; codes [typeMismatch.userCreateForm.userRole,typeMismatch.userRole,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userCreateForm.userRole,userRole]; arguments []; default message [userRole]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.List' for property 'userRole'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [ru.test.jpa.SystemRole] for property 'userRole[0]': no matching editors or conversion strategy found] 

사용자에를 - 목록입니다. jsp에서 선택한 역할 목록을 얻으려면 어떻게해야합니까?


나는 컨버터를

import org.springframework.beans.factory.annotation.Autowired; 

import org.springframework.core.convert.converter.Converter; 
import org.springframework.stereotype.Component; 
import ru.test.jpa.SystemRole; 

@Component("userRoleConverter") 
public class UserRoleConverter implements Converter<String, SystemRole> { 

    @Autowired 
    private ResourceService<SystemRole> systemRoleService; 


    @Override 
    public SystemRole convert(String id) { 
     return systemRoleService.findOne(Long.valueOf(id)); 
    } 
} 

을 추가 스프린트-context.xml에

<beans:bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
    <beans:property name="converters"> 
      <beans:ref bean="userRoleConverter"/> 
    </beans:property> 
</beans:bean> 

나는 여전히 같은 오류에 등록했다. 무엇이 잘못 되었나요?

감사합니다.

+1

로그를 사용하려고 시도하십시오 (또는 적어도 Sytem.err.println을 사용하여 역할을 선택할 때 컨트롤러에서 사용하는 경로를 제어하십시오 - 오류가있는 것으로 의심됩니다 ... –

+0

@SergeBallesta, 경로는 정확하지만 BUT 만약 역할을 선택했다면'@ ModelAttribute'에서 User ... 대신 SystemRole 객체를 얻습니다. ( – user1647166

+0

'userForm'이 아닌'userCreateForm'이라는 이름의 객체에 바인딩하고 있습니다.'@ ModelAttribute'를 사용할 때 명시 적으로 이름을 지정하지 않으면 메소드 인수의 이름을 취합니다 (이 경우에는'userForm'). 매개 변수 이름을 변경하거나'@ ModelAttribute' 주석 내에서 명시 적으로 인수의 이름을 지정하십시오. 기본적으로 오류가 발생하면'userCreateForm' 객체가 사라지고'userForm'이 갑자기 사용 가능합니다. –

답변

0

오류 메시지의 가장 관련성이 높은 부분은 Cannot convert value of type [java.lang.String] to required type [ru.test.jpa.SystemRole] for property 'userRole[0]'입니다.

User 클래스를 표시하지 않았지만 오류로 인해 userRoleSystemRole의 컬렉션 또는 배열이라고 가정합니다.

class UserWrapper { 
    class User user = new User(); 

    // delegates for setters and getters omitted for breivety 
    public void setStrUserRole(List<String> strRole) { 
     role = new List<SystemRole>(); 
     for (String str: strRole) { 
      // build role r form its String representation 
      role.add(r); 
     } 
    } 
} 

또는 당신이 Converter<String, SystemRole>를 생성하고 Spring에 의해 사용되는 DefaultFormattingConversionService에 등록 할 수 있습니다 : 당신은 역할을 문자열의 컬렉션을 받아들이는 세터을 가지고 있으며, 생성 폼 객체, 같은 같은 래퍼 클래스를 사용할 수 있습니다. 새로운 컨버터를

<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" 
     id="conversionService"/> 
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean" 
     p:targetObject-ref="conversionService" p:targetMethod="addConverter"> 
    <property name="arguments"> 
     <list> 
      <value type="java.lang.Class">java.lang.String</value> 
      <value type="java.lang.Class">ru.test.jpa.SystemRole</value> 
      <ref bean="userRoleConverter"/> 
     </list> 
    </property> 
</bean> 

원하기 때문에을 추가 할 기본 봄 컨버터의 전체 무리를 대체하지 : 당신은 XML 구성을 사용하는 경우

, 당신은 방법은 새로운 변환기를 등록 할 수 있습니다.

+0

안녕하세요, 도움 주셔서 감사합니다.하지만 여전히 문제가 있습니다. 제발 도와주세요, 이것이 마지막 단계입니다. 질문에 대한 마지막 변경 사항을 살펴보십시오. 나는 변환기를 추가하고 그것을 config.xml에 등록했다. 하지만'DefaultFormattingConversionService'를 사용할 수 없습니다 - 오류를 얻습니다 : "... cannt는 UserRoleConverter를 StringValueResolver로 변환 할 수 없습니다 ...". 어떻게 변환기를 등록해야하는지 말해 주실 수 있겠습니까? 감사. – user1647166

+0

@ user1647166 : 방금 내 게시물을 편집했습니다. –

+0

동일한 오류가 발생합니다. (죄송합니다, 방금 게시물을 수정했습니다 .. – user1647166