복붙노트

[SPRING] JBoss (6.2.0 GA)에서 EJB Jar에서 잭슨 2 주석이 무시되었습니다.

SPRING

JBoss (6.2.0 GA)에서 EJB Jar에서 잭슨 2 주석이 무시되었습니다.

웹 스피어 7 (JEE5)에서 JBoss EAP 6.2.0 (JEE6)으로 웹 애플리케이션을 마이그레이션하려고합니다. 현재 Glassfish 3 & WAS에서 잘 작동합니다.

웹 인터페이스는 JSON을 소비 / 생성합니다. Spring 3 MVC MappingJackson2HttpMessageConverter와 함께 Jackson2를 사용하여 간단한 컨트롤러 클래스에서 직렬화를 처리합니다.

JBoss에서 @JsonProperty 등의 Jackson2 주석이 ejb 모듈에서 무시되는 것을 봅니다 (JPA 엔티티에만 적용됨). 그러나 웹 모듈에 적용되고 있습니다. 따라서 JBoss의 일부 객체에 대해 사용자 인터페이스를 변경하는 여러 필드 이름을 사용하여 응답이 돌아옵니다.

나는 jboss-deployment-structure.xml의 모든 permuation을 무용지물로 시도했다 (아래 참조). JBoss가 Jackson 1.x를 내부 모듈로 제공한다는 사실을 알고 있습니다. 그러나 이것은 문제가되지 않는 것 같습니다. 그렇지 않으면 웹 모듈 주석도 무시됩니다. 예 : JBOSS에 배포 한 후 잭슨 주석이 무시 됨

응용 프로그램은 전쟁, ejb (항아리) 및 귀 컨테이너와 같은 3 가지 모듈로 구성됩니다.

JPA 엔티티에서 주석을 제거하는 코드를 리팩터링하려고 하겠지만 마이그레이션 할 다른 여러 가지 응용 프로그램이 있으므로 실제로 일관된 솔루션을 찾는 것이 좋습니다.

<jboss-deployment-structure>
    <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    <deployment>
        <exclusions>
            <module name="org.codehaus.jackson.jackson-core-asl"/>
            <module name="org.codehaus.jackson.jackson-mapper-asl"/>
        </exclusions>
    </deployment>
    <sub-deployment name="my-war.war">
        <exclusions>
            <module name="org.codehaus.jackson.jackson-core-asl"/>
            <module name="org.codehaus.jackson.jackson-mapper-asl"/>
        </exclusions>
    </sub-deployment>
    <sub-deployment name="my-ejbs.jar">
        <exclusions>
            <module name="org.codehaus.jackson.jackson-core-asl"/>
            <module name="org.codehaus.jackson.jackson-mapper-asl"/>
        </exclusions>
    </sub-deployment>
</jboss-deployment-structure>

원래 문제가 무엇을 일으켰는지는 설명하지 않지만 웹 모듈에서 Jackson Mixin을 추가하여 해당 필드의 이름을 바꾸거나 숨 깁니다. 나는 이것을 테스트했고 잘 동작한다.

이 모든 것에 대한 요지는 Jackson Mixin을 사용하면 직렬화의 사용자 정의 범위가 웹 모듈에만 국한되어 ejb-jar 하위 배포로 인한 클래스로드 문제를 피할 수 있습니다. jboss-deployment-structure.xml이 사용되지 않습니다.

ami new 추가

public interface MyMixin {


    @JsonIgnore
    String getUnwantedField();

    @JsonProperty(value = "newName")
    String getOldName();

}

그런 다음 내 웹 컨트롤러를 시작할 때 Mixin을 Jackson ObjectMapper에 연결합니다.이 객체는 컨트롤러에 자동으로 연결되고 디스패처 서블릿 xml config에 정의됩니다.

 @Autowired
 private ObjectMapper objectMapper;

 @PostConstruct
    void configObjectMapper() {
        objectMapper.addMixInAnnotations(MyEjbJar.class, MyMixin.class);     
    }

Dispatcher 서블릿 :

.
.
    <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper"/>

해결법

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

    1.나는 이것을 (IDE 디버거를 통해 & 로깅을 추가하여) war 모듈과 ejb jar 모듈에 사용되는 다른 클래스 로더를 추적했다. 이는 문서에 따라 JBoss AS 7에서 예상되는 기본 동작입니다. war는 War ModuleLoader를 사용하고 ejb jar는 ear ModuleLoader를 사용합니다.

    나는 이것을 (IDE 디버거를 통해 & 로깅을 추가하여) war 모듈과 ejb jar 모듈에 사용되는 다른 클래스 로더를 추적했다. 이는 문서에 따라 JBoss AS 7에서 예상되는 기본 동작입니다. war는 War ModuleLoader를 사용하고 ejb jar는 ear ModuleLoader를 사용합니다.

    어노테이션을로드하는 클래스 로더에 따라 주석 클래스가 다릅니다. 참조 : SO와 유사한 문제

    "다릅니다"라는 말은 동일한 항아리 및 버전에서 제공된 동일한 주석이지만 equals에 대한 계약에 따라 동등한 것으로 간주되지는 않지만 해시 코드가 다르기 때문에 JacksonAnnotationIntrospector는 주석이있는 것처럼 보이더라도 주석을 찾지 않습니다. JPA POJO 클래스와 비교합니다.

    이 문제를 해결하기 위해 귀 모듈러 로더를 jackson 2의 공통 로더로 만들어 보았습니다. com.fasterxml.jackson.core 데이터 바인드 종속성을 war & ejb jar의 범위를 제공하고이를 일반 컴파일 범위로 표시하여이 작업을 수행했습니다. 귀 POM의 의존성.

    이런 종류의 접근법은 jboss-deployment-structure 나 MANIFEST.MF를 사용하여 거의 동일한 것을 달성하기는하지만 JBoss AS 클래스 로딩을 보증합니다.

  2. from https://stackoverflow.com/questions/25763556/jackson-2-annotations-ignored-in-ejb-jar-with-jboss-6-2-0-ga by cc-by-sa and MIT license