[SPRING] Spring 3.0 MVC 바인딩 Enums 대 / 소문자 구분
SPRINGSpring 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.대체로 말하자면 정규화를 수행하는 새 PropertyEditor를 작성한 다음이를 컨트롤러에 등록하는 것입니다.
대체로 말하자면 정규화를 수행하는 새 PropertyEditor를 작성한 다음이를 컨트롤러에 등록하는 것입니다.
@InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Product.class, new CaseInsensitivePropertyEditor()); }
-
==============================
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.다음과 같이 모든 열거 형에서 사용할 수있는 일반 변환기를 만들 수도 있습니다.
다음과 같이 모든 열거 형에서 사용할 수있는 일반 변환기를 만들 수도 있습니다.
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.@ 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.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에서의 첫 번째 결과입니다.
from https://stackoverflow.com/questions/4617099/spring-3-0-mvc-binding-enums-case-sensitive by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 동적 속성 목록을 스프링 관리 빈으로 읽기 (0) | 2018.12.23 |
---|---|
[SPRING] 두 컨텍스트에 빈이 포함되도록 Java-config 클래스를 XML-config로 가져 오는 방법은 무엇입니까? (0) | 2018.12.23 |
[SPRING] ApplicationContext 자체 삽입하는 법 (0) | 2018.12.23 |
[SPRING] Spring 데이터 + 다중 데이터 소스가 있지만 하나의 리포지토리 세트 만있는 JPA (0) | 2018.12.23 |
[SPRING] Spring : 컨텍스트 루트 외부에서 정적 리소스 제공 (0) | 2018.12.23 |