Jerome Dalbert
그는 물었다 8년 전
129

Spring MVC 유형 변환: 프로페르티에디터, Converter?

나는 가장 쉽고 간단한 방법은 data-in 봄 찾는 바인딩하지 및 변환 적용한다. 가능하면 수행하지 않고 xml 구성.

지금까지, ve been I& # 39 를 사용하여 [프로페르티에디터스] [1] 같은 있습니다.

public class CategoryEditor extends PropertyEditorSupport {

    // Converts a String to a Category (when submitting form)
    @Override
    public void setAsText(String text) {
        Category c = new Category(text);
        this.setValue(c);
    }

    // Converts a Category to a String (when displaying form)
    @Override
    public String getAsText() {
        Category c = (Category) this.getValue();
        return c.getName();
    }

}

...
public class MyController {

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

    ...

}

이 방법은 간단합니다. 모두 같은 클래스에 정의됩니까 변환 및 바인딩하면 간단합니다. 만약 내가 하고 싶은 일을 할 수 있는 한 모든 일반 바인딩하면 여전히 내 컨트롤러에서는 추가 [3 선 내 xlm 구성용] [2].

-

하지만 봄 3.x 는 새로운 방법을 사용하여 그것을하지 [컨버터] [3]:

&gt. 이 시스템 내에 스프링을 컨테이너인 대안으로 사용할 수 있습니다 &gt. 프로페르티에디터스 수

그래서 let& # 39 라고, s, I want to use 컨버터 &quot 있기 때문에 최신 alternative". 컨버터 2 내가 만들 수 있을 것이라고 말했다.

public class StringToCategory implements Converter<String, Category> {

    @Override
    public Category convert(String source) {
        Category c = new Category(source);
        return c;
    }

}

public class CategoryToString implements Converter<Category, String> {

    @Override
    public String convert(Category source) {
        return source.getName();
    }

}

    • 내가 먼저 해야 할 2 가지 단점. 이점: 덕분에 제너레이시 캐스트 필요가 없습니다.

그런 다음 바인딩해야 단순한 데이터 컨버터 어떻게 합니까?

, T # 39 haven& 단점이 ss+sp 내가 할 수 있는 모든 간단한 방법 (주석 또는 기타 프로그램 협업공간을) 컨트롤러. 아무것도아니야 like '섬스프링롭ject.지스테르쿠스토무컨베터 (.),'.

39, ve I& 유일한 방법이 아닌 일반 금지커서 컨트롤러거 바인딩하면 http://support. 약간만이라도 비효율적임 단순하고, 정도에 불과하다.

  • [Xlm 구성용] [4]:

id = &quot &lt, 콩, conversionService&quot. class = &quot org.springframework.context.support.ConversionServiceFactoryBean&quot >;; name = &quot &lt, 속성, converters&quot >; &lt set>; &lt, 콩, class = &quot somepackage.StringToCategory&quot />; &lt, 콩, class = &quot somepackage.CategoryToString&quot />; &lt /set>; &lt /property>; &lt /bean>;

  • [Jave 구성용] [5] ( 전용 봄 3.1+):

@EnableWebMvc @Configuration public class 웹콘피그 웨브 비스콘피구러섬프터 연장시킵니다 {

@Override void 금지되었는지 아드포르마터스 (포르마테르기스트리 레지스트리로) { 레지스트리지아다컨베터 (새 스트라이토카테고리 ()); 레지스트리지아다컨베터 (새 카테고리토스트링 ()); }

}

이러한 모든 변환기를 사용하여 함께 단점, 왜? 내가 무언가 빠진? 다른 발생합니까 요령, 제가 알지?

나는 유혹에 빠지기 사용하여 그럽세 프로페르티에디터스. 바인딩하면 빠르고 훨씬 쉽습니다.

[1]: # beans 콩 쿠스토메디터 맞춰찍기 변환 .0.x/spring-framework-reference/html/validation.html http://static.springsource.org/spring/docs/3 [2]: # mvc 앤 웹다타빈더 .0.x/spring-framework-reference/html/mvc.html http://static.springsource.org/spring/docs/3 [3]: # 핵심 변환하시겠습니까 .0.x/spring-framework-reference/html/validation.html http://static.springsource.org/spring/docs/3 [4]: # 봄 변환하시겠습니까 핵심 구성 .0.x/spring-framework-reference/html/validation.html http://static.springsource.org/spring/docs/3 [5]: # mvc 구성용 사용자정의할 .1.x/spring-framework-reference/html/mvc.html http://static.springsource.org/spring/docs/3

mauhiz
그는 4년 전 댓글을 달았습니다
0

참고 (봄, 내가 너무 사용하여 발견했다 3.2.17) 를 사용하여 때 &lt mvc 주석 제어됨을 />; 실제로 빈 콘버시온저비스 참조할 필요가 있다. &lt mvc 주석 제어됨을 변환 서비스 = &quot conversionservice";; /&gt.

Paco Abato
그는 2년 전 댓글을 달았습니다
0

아드포르마터스 (.) 있어야 한다. 또한 웨브 비스콘피구러섬프터 이후 5.0 은 더 이상 사용되지 않습니다.

답변 4 개

&gt. 이러한 모든 변환기를 사용하여 함께 단점, 왜? 내가 누각되었습니다 &gt. 뭔가? 다른 발생합니까 요령, 제가 알지?

아니, 난 그렇게 생각해 종합적으로 설명됨 모두 프로페르티에디터 및 변환기, 어떤 방식으로 각 1 은 매우 및 레지스터링 선언했다.

내 마음을 프로페르티에디터스 제한되어 있거나, 이 유형에 대한 변환하십시오 유효범위 - 그들은 도움말에서는 문자열이어야 문자열이어야 않했노라 프로페르티에디터 등록 및 사용, 그래서 일반적으로 사용하는 UI 에서 @InitBinder 웹다타빈더 이다.

반면, 좀 더 일반적인 converter 는 간추렸습니다 아니라 시스템의 모든 변환 - UI 에 대한 관련 변환에는 (구체화하십시오 타겟으로의 유형용). 예, 봄 통합을 위해 컨버터를 사용하여 변환하기 위한 것이라는 메시지를 광범위하게 일반적으로 원하는 유형:.

내 생각엔 여전히 흐르고 있는 경우를 특히 UI 에 대한 적절한 프로페르티에디터스 관련 일을 할 때 특정 명령에 대한 재산이잖아 사용자 정의 또 다른 경우, 스프링 참조 및 쓰기 위해 꼭 이래야겠어요 시행하십시오 컨버터 대신 권장안을 의 경우 (예, 긴 id 를 통해 변환하십시오 엔티티입니다 말하도다 비호환성의 샘플링합니다).

Boris Treukhov
그는 8년 전 댓글을 달았습니다
5

또 한 번의 심아이엔큐 컨버터 및 작성, 편집, 여러 번 많은 재산을 모두 동시에 독립적인 api 호출, I 는 상태형 구현됩니까 don& # 39 이 모든 것이 상당한 효과를 거둘 수 있을 것 같지는 않다, 컨버터 및 성능에 대한 깔끔한 간단해진다는 불과합니다.

Jerome Dalbert
그는 8년 전 댓글을 달았습니다
1

알아주지 않는 경우, 특히 @boris 있음-그러나 간단해진다는 아니었던가. 쓰기 2 + 추가 구성 또는 xml 변환기 클래스뿐만 할 여러 줄의 jave 구성용. 나는 얘기를 MVC 의 일반 양식 제출, 봄 / 디스플레이하여 변환에는 아니라 엔티티에는).

  1. ( 오르g. 스프링프라임워k.포르마스포르마터 구현하십시오) 대신 사용할 경우 to / from 구체화하십시오 변환에는 포맷터 컨버터. 이 회사는 방법 및 보기인쇄 (.), 그래서 한 클래스 2 개가 아니라 구문 분석 (.) 만 있으면 됩니다. , 포르마팅컨베르시온저비스파스토이빈 그들을 모두 사용할 수 있는 등록하려면 등록 대신 콘버시온저비스파스토이빈 포맷터 컨버터, , .
  2. 새로운 포맷터 stuff 는 몇 가지 추가 혜택을 얻을 수 있습니다.
    • 포맷터 인터페이스입니다 보기인쇄 (.) 물품요 로켈을 있는 개체의 분석할 수 있는 방법을 찾기 때문에 문자열 변환 및 로캘 구분 (.)
    • , 포르마팅컨베르시온저비스파스토이빈 않했노라 포맷터 미리 등록한 외에 몇 번의 사전 등록 되어 있는 통해 추가 서식 매개변수입니다 주석 아노테이션포마테르파스토리 오브젝트에도 지정할 수 있습니다. 예를 들면 다음과 같습니다.
    • 로카르다테 바제다테 제공합니다. @requestparam *@DateTimeFormat (패턴 = &quot MM-dd-yy";)

      39 의 it& 직접 만들 수 없는 매우 어려운 누마버포마타누테이션포마테르파스토리 아노테이션포마테르파스토리 클래스뿐만 http://schmidt. devlib. Spring& # 39 에 대한 간단한 예를.

      이렇게 하면 포맷터 / 편집기 특정 컨트롤러거 필요할 것 같아요. 콘버시온저비스 하나 사용 및 서식 사용자정의할 통해 모든 컨트롤러에서는 주석입니다.

  3. I agree 있는 문자열 변환, 가장 간단한 방법은 아직도 여전히 필요한 경우 일부 특정 컨트롤러거 사용자 정의 등록 정보 편집기. (시도는 해봤는데 & # 39, & # 39, 호출하십시오 빈더릭세컨베르시온저비스 (.) 하지만 내 @InitBinder 방법 # 39, & # 39 실패한 이후, 바인더 객체에는 global& 함께 제공됩니다. 변환 서비스가 이미 설정되었습니다. 봄 같다 언제나 컨트롤러마다 변환 클래스는 3).

가장 간단한 (사용하고 있는 것으로 persistence framework), 완벽한 방법은 서피스뿐 아니라 일반 엔티티입니다 변환기) 를 통해 '가' 인터페이스입니다 구현하십시오 콘딧요날제너레이스컨베터 변환하십시오 엔티티에는 활용하여 메타데이터입니다.

예를 들어, 제파 사용하는 경우, 지정된 경우 클래스에는 '주석 및 활용' 이 변환기 보일 수도 있지만 @Entity @Id '현장' 주석을 단 제공된 구체화하십시오 값을 사용하여 자동으로 정보 및 조회 푸십시오 실행하십시오 표시됨과 id 를 조회.

public interface ConditionalGenericConverter extends GenericConverter {
    boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType);
}
',' 는 최고의 weapon&quot 콘딧요날제너레이스컨베터 &quot. 하지만 한 번 apiu 봄 변환 처리할 수 있을지, 대부분 기술입니까 구현됩니까 변환 엔티티에는 절약합니다 개발자 시간 - # 39 의 구호 it& 숭배자들로부터도 때 고객의 컨트롤러거 랑하니 절대 그냥 대체하십시오 엔티티입니다 클래스뿐만 매개변수로 구축에 대한 새로운 컨버터 (사용자 정의 및 제외한 비 실체 유형, 물론).

Jerome Dalbert
그는 8년 전 댓글을 달았습니다
0

좋은 솔루션 공급 계약을 체결, 이 전략은 변환에만 엔티티에는, 함께 해 주셔서 감사합니다. 처음부터 않을 때 한 번 더 단순하고 간단한 쓰지 않을 수 있지만, 장기적으로 사비 수업 시간.

Boris Treukhov
그는 8년 전 댓글을 달았습니다
0

브트와 컨버터 구현할 수 있는 모든 유형을 위한 장더 등 일부 일반 계약 - 또 다른 예를 들어: 이넘 경우 몇 가지 일반적인 역동기화 조회 인터페이스입니다 구현하십시오 구현할 수 있을 것입니다 - 그럼 또한 일반 컨버터 (비슷한 것 (https://stackoverflow.com/questions/5178622/spring-custom-converter-for-all-enums)

Boris Treukhov
그는 8년 전 댓글을 달았습니다
0

@JeromeDalbert 그러하너라 it& # 39 의 다소 어려운 kingdome. seattle. 초보자 위한 몇 가지 중량 stuff, 신앙이니라 you have a 팀 개발자 받을 수 있을 뿐만 아니라 간단해진다는) P. S. 될 것 같은 지루한 등록하려면 등록 정보 편집기 어쨌든 바인딩하면 때마다 (form)

두 개의 별도 컨버터 클래스뿐만 필요성을 해결할 수 있는 일종의 구현하여 정적임 내부 클래스뿐만 컨버터 2 있다.

public class FooConverter {
    public static class BarToBaz implements Converter<Bar, Baz> {
        @Override public Baz convert(Bar bar) { ... }
    }
    public static class BazToBar implements Converter<Baz, Bar> {
        @Override public Bar convert(Baz baz) { ... }
    }
}

여전히 등록해야 하는 것과 별도로 둘 다 있지만, 적어도 이 파일을 변경하면 수에 따라 다운되어도 잘라냅니다 수정해야 합니다.