2017-03-10 1 views
2

캐스트 할 수없는, 나는봄 (4.2.6) + 잭슨 (2.8.4) + 일반 유형 : 내가 지정하는 경우 java.util.LinkedHashMap 이틀 후

... 다음에 붙어 컨트롤러의 유형, 그것은 작동합니다

@RestController 
public class FooController { 
    @RequestMapping(method = RequestMethod.POST) 
    protected ResponseModel bar(@Valid @RequestBody Foo foo) { 
     // here I have foo of type Foo 
    } 
} 

을하지만, 내가 제네릭을 활용하려고하면, 그것은 작동하지 않습니다

public class Base<U> { 
    @RequestMapping(method = RequestMethod.POST) 
    protected ResponseModel bar(@Valid @RequestBody U entity) { 
     // here I get java.util.LinkedHashMap instead of U 
     // which, in the FooController, should be Foo 
    } 
} 

@RestController 
public class FooController extends Base<Foo> { 
} 

를 로그를 보면,이 컨트롤러를 칠 때 정의 된 유형은 다음과 같습니다.

Read [class com...Foo] as "application/json;charset=UTF-8" with [org.springfr[email protected]cee662] 

동안 일반 하나에 :

Read [U] as "application/json;charset=UTF-8" with [org.springfr[email protected]cee662] 

Q : 내가 일반 유형을 활용해야하고, 컨트롤러에서 반복되는 코드를 절감 할 수 있도록?

참고 :이 다른 모든 질문부터 중복은 약 List<T> 또는 ~ 2.6에 대한 문제에서이다 아닙니다 *

부록 :. Yuri-M-Dias, 나는 않았다하는 너무 2.5.5 작품을 다운 그레이드 제안 일반 유형이지만 2.8.4는 그렇지 않습니다.

내가 개정 2.7.9 나는, 좋은 것을 발견 ... 다운 그레이드에 더 나아가

(적어도 지금 나는 나쁜 좋은 작동하도록 개정 ...이) 2.834에서 LinkedHashMap<K,V>을 얻는 동안 U에서 Foo을 얻으십시오. 아마도 ... 2.8.0 release에서 뭔가를 놓쳤을까요?

+0

String을 사용하고 Jackson의 ObjectMapper를 사용하여 변환하지 않는 이유는 무엇입니까? –

+0

이것은 내부에'List'가없는 간단한 엔티티로 해결할 수 있습니다. 그러나 일단 거기에 도착하면 잭슨이 꽤 잘하는 타입 유추를 잃을 것입니다 ... 그리고 타입 어노테이션으로'List '문제를 해결할 수있는 가능성을 잃을 것입니다 ... – joaumg

+0

이 잭슨 문제와 관련이있을 수 있습니다 : [제네릭 형식의 비 직렬화는 2.7.0 이후에 작동하지 않습니다.] (https://github.com/FasterXML/jackson-databind/issues/1210)/[일반 형식 및 빌더에서 제대로 작동하지 않는 직렬화 해제] (https : // github. com/FasterXML/jackson-databind/issues/921). 첫 번째 링크는 2.7.4의 수정 사항을 설명합니다. 두 번째 링크는 예상되는 클래스 대신'LinkedHashMap'을받는 것과 같은 증상을 경험하지만 현재 누구도이 문제를 해결하지 못하는 것 같습니다. –

답변

0

Generic Controller in Spring MVC을 보았는지는 모르지만 그것은 도움이 될 수 있습니다. 그래도 내가 설명하려고하는 것에 만족스럽지 않습니다. 왜냐하면 당신이 위에서 무엇을하려하는지 알기 때문입니다. 또한, 나는 당신에게 가능한 "필요성"뒤에있는 이유를 줄 수 없습니다. 바라건대 다른 누군가가 그것을 채울 수 있기를 바랍니다.

@RestController 
public class FooController extends Base<Foo> { 
    @RequestMapping(method = RequestMethod.POST) 
    protected ResponseModel bar(@Valid @RequestBody Foo foo) { 
     super.bar(foo); 
    } 
} 

모든 것을 행복하게 만들어야하는 것처럼 보입니다.

+0

이것은 코드 중복을 해결하지 못합니다 ... 단지 약간 더 작게 만들 것입니다 ... – joaumg