2017-11-21 9 views
0

spring mvcを使用して、複数のスキル(複数選択を使用)を選択できるページを作成中です。私はスキルを表示することができます。しかし、スキルを選択し、送信をクリックすると、私は以下のエラーが表示されます。以下はspring mvcアプリケーションで複数選択のフォームを送信できません

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'candidate' on field 'skills': rejected value [1,3,4]; codes [typeMismatch.candidate.skills,typeMismatch.skills,typeMismatch.java.util.List,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [candidate.skills,skills]; arguments []; default message [skills]]; default message [Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.List' for property 'skills'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.cts.form.SkillForm] for property 'skills[0]': no matching editors or conversion strategy found] 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:113) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) 
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 

私のコードです:

public class CandidateForm { 

private String name; 
.......... 
private List<SkillForm> skills; 
.. setters ad getters 

}

public class SkillForm { 
    private Integer id; 
    private String name; 
    private String description; 
    private String isSelected; 
    ......... setters and getters 
} 

--- JSP

<div class="form-group col-md-6 col-sm-6"> 
          <form:label for="skills" path="skills">Candidate Primary Skills *</form:label> 
          <form:select multiple="true" path="skills" class="form-control input-sm" id="skills" > 
           <c:forEach var="item" items="${candidate.skills}"> 
            <form:option selected="${item.isSelected}" value="${item.id}" >${item.name}</form:option> 
           </c:forEach> 
          </form:select> 
         </div> 

フォーマッタ

@Component 
public class SkillFormatter implements Formatter<SkillForm>{ 

    public SkillFormatter() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public String print(SkillForm object, Locale locale) { 
     // TODO Auto-generated method stub 
     return object.getId().toString(); 
    } 

    @Override 
    public SkillForm parse(String text, Locale locale) throws ParseException { 
     // TODO Auto-generated method stub 
     SkillForm form = new SkillForm(); 
     form.setId(Integer.parseInt(text)); 
     return form; 
    } 

Bean構成

<context:component-scan base-package="com.cts.formatter" /> 
    <beans:bean id="conversionService" 
     class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 
     <beans:property name="formatters"> 
      <beans:set> 
       <beans:ref bean="skillFormatter" /> 
      </beans:set> 
     </beans:property> 
    </beans:bean> 

    <annotation-driven conversion-service="conversionService" /> 

コントローラ

@RequestMapping(value = "/candidate/submit", method = RequestMethod.POST) 
     public String submitNewCandidate(@ModelAttribute("candidate") CandidateForm form, ModelMap model,BindingResult bindingResult) { 
      if(logger.isDebugEnabled()){ 
       logger.debug("createCandidate is executed!"); 
      } 
      ----------------------- 
      return "newCandidate"; 
     } 

Iは参照として本pageを有します。なぜ、私はフォーマッタを設定していても、それは呼び出されないのですか?私はコントローラメソッドで何かすべきですか?

答えて

0

あなたのコードをspringmvcプロジェクトにコピーしますが、それは成功しました。私のコードを貼り付けます。

<bean id="skillFormatter" class="org.spring.test.test.SkillFormatter"></bean> 

<mvc:annotation-driven conversion-service="conversionService"/> 

フォーマッタが正しく登録され、スプリングバージョンが適切であることを確認してください。

+0

Formatterが正しく登録されています。 org :: springframework.core.convert.ConverterNotFoundException:タイプjava.util.ArrayListから変換できるコンバータが見つかりませんでした。 .springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:313) – Anveshan

+0

@Anveshan私のコンバーターは設定XMLに登録されていません。確かに、ArrayListをResourceのどこかに変換するフレームワークを強制するいくつかのコードがあります。 –