복붙노트

[SPRING] Spring 3.0 MVC 바인딩 Enums 대 / 소문자 구분

SPRING

Spring 3.0 MVC 바인딩 Enums 대 / 소문자 구분

Spring 컨트롤러에서 RequestMapping을 사용한다면 ...

@RequestMapping(method = RequestMethod.GET, value = "{product}")
public ModelAndView getPage(@PathVariable Product product)

그리고 제품은 enum입니다. 예. 제품. 홈

페이지를 요청하면 mysite.com/home

나는 얻다

Unable to convert value "home" from type 'java.lang.String' to type 'domain.model.product.Product'; nested exception is java.lang.IllegalArgumentException: No enum const class domain.model.product.Product.home

열거 형 변환기를 사용하여 소문자 홈이 실제로 홈인지 알 수있는 방법이 있습니까?

나는 대소 문자를 구분하지 않고 자바 대문자를 표준 대문자로 유지하고 싶다.

감사

해결책

public class ProductEnumConverter extends PropertyEditorSupport
{
    @Override public void setAsText(final String text) throws IllegalArgumentException
    {
        setValue(Product.valueOf(WordUtils.capitalizeFully(text.trim())));
    }
}

등록

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="customEditors">
            <map>
                <entry key="domain.model.product.Product" value="domain.infrastructure.ProductEnumConverter"/>
            </map>
        </property>
    </bean>

특별 변환이 필요한 컨트롤러에 추가

@InitBinder
public void initBinder(WebDataBinder binder)
{
    binder.registerCustomEditor(Product.class, new ProductEnumConverter());
} 

해결법

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

    1.대체로 말하자면 정규화를 수행하는 새 PropertyEditor를 작성한 다음이를 컨트롤러에 등록하는 것입니다.

    대체로 말하자면 정규화를 수행하는 새 PropertyEditor를 작성한 다음이를 컨트롤러에 등록하는 것입니다.

    @InitBinder
     public void initBinder(WebDataBinder binder) {
    
      binder.registerCustomEditor(Product.class,
        new CaseInsensitivePropertyEditor());
     }
    
  2. ==============================

    2.사용자 정의 PropertyEditor를 구현해야한다고 생각합니다.

    사용자 정의 PropertyEditor를 구현해야한다고 생각합니다.

    이 같은:

    public class ProductEditor extends PropertyEditorSupport{
    
        @Override
        public void setAsText(final String text){
            setValue(Product.valueOf(text.toUpperCase()));
        }
    
    }
    

    그것을 묶는 방법에 대한 GaryF의 대답을보십시오.

    enum 상수에 소문자를 사용하는 경우를 대비하여 좀 더 관대 한 버전이 있습니다.

    @Override
    public void setAsText(final String text){
        Product product = null;
        for(final Product candidate : Product.values()){
            if(candidate.name().equalsIgnoreCase(text)){
                product = candidate;
                break;
            }
        }
        setValue(product);
    }
    
  3. ==============================

    3.다음과 같이 모든 열거 형에서 사용할 수있는 일반 변환기를 만들 수도 있습니다.

    다음과 같이 모든 열거 형에서 사용할 수있는 일반 변환기를 만들 수도 있습니다.

    public class CaseInsensitiveConverter<T extends Enum<T>> extends PropertyEditorSupport {
    
        private final Class<T> typeParameterClass;
    
        public CaseInsensitiveConverter(Class<T> typeParameterClass) {
            super();
            this.typeParameterClass = typeParameterClass;
        }
    
        @Override
        public void setAsText(final String text) throws IllegalArgumentException {
            String upper = text.toUpperCase(); // or something more robust
            T value = T.valueOf(typeParameterClass, upper);
            setValue(value);
        }
    }
    

    용법:

    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(MyEnum.class, new CaseInsensitiveConverter<>(MyEnum.class));
    }
    

    또는 전 세계적으로 skaffman이 설명합니다.

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

    4.@ GaryF의 답변에 추가하고 사용자의 의견을 언급하려면 사용자 지정 AnnotationMethodHandlerAdapter에 전역 사용자 정의 속성 편집기를 삽입하여 선언 할 수 있습니다. Spring MVC는 보통 기본적으로 이들 중 하나를 등록하지만, 선택하면 특별히 구성된 MVC를 지정할 수있다.

    @ GaryF의 답변에 추가하고 사용자의 의견을 언급하려면 사용자 지정 AnnotationMethodHandlerAdapter에 전역 사용자 정의 속성 편집기를 삽입하여 선언 할 수 있습니다. Spring MVC는 보통 기본적으로 이들 중 하나를 등록하지만, 선택하면 특별히 구성된 MVC를 지정할 수있다.

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
      <property name="webBindingInitializer">
        <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
          <property name="propertyEditorRegistrars">
            <list>
              <bean class="com.xyz.MyPropertyEditorRegistrar"/>
            </list>
          </property>
        </bean>
      </property>
    </bean>
    

    MyPropertyEditorRegistrar는 PropertyEditorRegistrar의 인스턴스이며, 차례로 사용자 정의 PropertyEditor 객체를 Spring으로 등록합니다.

    간단하게 선언하면 충분합니다.

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

    5.Spring Boot 2에서는 ApplicationConversionService를 사용할 수 있습니다. 유용한 변환기를 제공합니다. 특히 org.springframework.boot.convert.StringToEnumIgnoringCaseConverterFactory - 문자열 값을 enum 인스턴스로 변환합니다. 이것은 가장 일반적인 것입니다 (열거 형마다 별도의 변환기 / 포맷터를 작성할 필요가 없습니다). 그리고 내가 찾은 가장 간단한 솔루션입니다.

    Spring Boot 2에서는 ApplicationConversionService를 사용할 수 있습니다. 유용한 변환기를 제공합니다. 특히 org.springframework.boot.convert.StringToEnumIgnoringCaseConverterFactory - 문자열 값을 enum 인스턴스로 변환합니다. 이것은 가장 일반적인 것입니다 (열거 형마다 별도의 변환기 / 포맷터를 작성할 필요가 없습니다). 그리고 내가 찾은 가장 간단한 솔루션입니다.

    import org.springframework.boot.convert.ApplicationConversionService;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.format.FormatterRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class AppWebMvcConfigurer implements WebMvcConfigurer {
        @Override
        public void addFormatters(FormatterRegistry registry) {
            ApplicationConversionService.configure(registry);
        }
    }
    

    그 질문은 스프링 3에 관한 것이지만 이것은 봄 mvc enums 대소 문자를 구분하지 않는 구문을 검색 할 때 Google에서의 첫 번째 결과입니다.

  6. from https://stackoverflow.com/questions/4617099/spring-3-0-mvc-binding-enums-case-sensitive by cc-by-sa and MIT license