복붙노트

[SPRING] 봄 폼 바인딩하는 방법? [java.lang.String] 유형의 값을 필수 유형으로 변환 할 수 없습니다.

SPRING

봄 폼 바인딩하는 방법? [java.lang.String] 유형의 값을 필수 유형으로 변환 할 수 없습니다.

여기 내 양식이 있습니다 :

<form:form modelAttribute="fooDTO">
fooCountry: 
<form:select path="country">
  <form:options items="${countries}" itemLabel="shortName" itemValue="id"/> 
</form:select>

여기 뒷주머니입니다.

public class FooDTO
{
  private Country country;
 //getters and setters present
}

선택한 옵션의 기본값은 fooDTO의 국가 값으로 기본 설정되어 있습니다. 그러나 양식을 제출할 때 바인드가 실패합니다. 나는 aformentioned 오류가 발생합니다. 바인더에 사용자 정의 편집기를 등록해야합니까? 아니면 더 간단한 방법이 있습니까? 나라는 당신이 기대하는 것만 큼이나 나라는 실제로 컨트롤러에있는 국가의 목록입니다 ...

해결법

  1. ==============================

    1.Spring 3에서는 Converter SPI를 도입하여 매우 쉽게 만들었습니다. 설명서에서 6.5를 살펴보십시오.

    Spring 3에서는 Converter SPI를 도입하여 매우 쉽게 만들었습니다. 설명서에서 6.5를 살펴보십시오.

    문서에서 소스를 가져 와서 국가에 넣으면 다음과 같이됩니다.

    package my.converter;
    
    final class StringToCountry implements Converter<String, Country> {
        public Country convert(String source) {
            return // whatever you do to get a country from your string
        }
    }
    

    그런 다음 xml 구성에서 변환기를 구성합니다.

    <bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="my.converter.StringToCountry"/>
            </list>
        </property>
    </bean>
    

    그리핀 도그 (GriffeyDog)가 지적했듯이, Country 객체의 toString ()이 반환하는 값 대신 ID 나 다른 값으로 국가를 가져올 수 있도록 선택 경로로 국가 ID를 넣을 수 있습니다.

  2. ==============================

    2.경로를
    로 변경하십시오. 적어도 게시 할 때 Country 객체 안에있는 id 필드를 제공합니다.

    경로를 로 변경하십시오. 적어도 게시 할 때 Country 객체 안에있는 id 필드를 제공합니다.

  3. ==============================

    3.문제는 Spring이 String 인스턴스를 보았지만 Country 인스턴스가 필요하다는 것을 알고 있다는 것이다. 기본적으로 하나에서 다른 하나에 이르는 방법을 "알지 못합니다".

    문제는 Spring이 String 인스턴스를 보았지만 Country 인스턴스가 필요하다는 것을 알고 있다는 것이다. 기본적으로 하나에서 다른 하나에 이르는 방법을 "알지 못합니다".

    이전에 Spring 폼 바인딩을 사용하지 않았지만 이는 스프링 프레임 워크 자체에서 발생할 수있는 것과 동일한 문제인 것처럼 보입니다. 후자의 경우 클래스의 PropertyEditor 구현을 등록하여이 문제를 해결하므로 유사한 접근 방식이 여기에서 작동 할 것으로 기대합니다.

  4. ==============================

    4.Spring에서는 ConversionService

    Spring에서는 ConversionService

    다음은 문서입니다. http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html#format-configuring-FormattingConversionService

    변환기 인터페이스를 구현해야합니다.

  5. ==============================

    5.내 솔루션을 살펴보십시오.

    내 솔루션을 살펴보십시오.

    public class CompanyIdToInstanceConverter implements Converter<String, Company> {
    
    @Autowired
    CompanyService _companyService;
    
    @Override
    public Company convert(final String companyIdStr) {
        return _companyService.find(Long.valueOf(companyIdStr));
    }
    
    }
    

    이것은 회사 ID를 선택에서 회사로 변환하여 DB에서 가져옵니다.

    다른 질문이 있으시면 지금 내 앱에서 비슷한 일을하고 있기 때문에 물어보십시오. :)

    또한 앱 컨텍스트에 추가해야합니다.

    <mvc:annotation-driven conversion-service="conversionService" />
    
    <!-- conversion service -->
    <bean id="conversionService"
        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>toryLabelConverter"></bean>
                <bean class="pl.greenpath.converter.CompanyIdToInstanceConverter"></bean>
            </set>
        </property>
    </bean>
    
  6. ==============================

    6.MVC 애플리케이션에서 작업하는 경우 애플리케이션 컨텍스트 구성 방법에 대한 Spring 소스 포럼 링크를 참조하십시오. 세부 정보는 스레드의 맨 아래에 있습니다.

    MVC 애플리케이션에서 작업하는 경우 애플리케이션 컨텍스트 구성 방법에 대한 Spring 소스 포럼 링크를 참조하십시오. 세부 정보는 스레드의 맨 아래에 있습니다.

    conversionService 클래스는 MVC와 다르므로 mvc : annotation-driven (주석을 사용하지 않더라도)을 지정해야합니다.

    http://forum.springsource.org/showthread.php?84003-Converters-no-matching-editors-or-conversion-strategy-found

    자세한 내용은 Spring 문서에서 찾을 수 있습니다. http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/validation.html#format-configuring-formatting-mvc

  7. from https://stackoverflow.com/questions/9416987/spring-form-binding-how-to-do-it-cannot-convert-value-of-type-java-lang-strin by cc-by-sa and MIT license