2017-10-02 8 views
1

JAX-RS 리소스 응답에 공통적 인 구조를 원합니다. 예를 들어, 당신은 PersonsResource 있다고 가정하고,이 같은 GET 방법 :ContainerResponseFilter의 응답을 수정하십시오.

@GET @Path("/{id}") 
public Person get(@PathParam("id") String id) { 
    return new Person(id); // 
} 

가 클라이언트 측의 응답을 가정 해이 같은 JSON입니다 : {"id":"some-id"}.

이제 내가 얻고 자하는 것은 ContainerResponseFilter를 갖는 것입니다.

{ 
    "meta":{ 
     "href":"http://this.is.request/url" 
    }, 
    "paging":{ 
     "offset":0, 
     "limit":10 
    }, 
    "entity":{ 
     "id":"some-id" 
    } 
} 

(내가 상용구 코드를 줄이기 위해 롬복을 사용하는 경우) 나는 다음과 같은 코드 내 아이디어를 실험 :

@Data @NoArgsConstructor @AllArgsConstructor 
@XmlAccessorType(XmlAccessType.FIELD) @XmlType 
public class Person { 
    private String id; 
} 

@XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement 
@Data @NoArgsConstructor @AllArgsConstructor 
public class WrappedResponse { 
    private Object entity; 
} 

@Provider @Slf4j 
public class WrappedResponseFilter implements ContainerResponseFilter { 
    @Override 
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { 
     responseContext.setEntity(new WrappedResponse(responseContext.getEntity())); 
    } 
} 
는이 같은 구조로 원래의 개체를 래핑 수 있도록 그것은 응답을 수정합니다

그러나 말풍선을 사용하여 끝점을 호출하면 얻을 수있는 것은 {"entity":"Person(id=xyz)"}입니다. 분명히 해당 MessageBodyWriter는 WrappedResponse의 entity 필드에 대해 toString() 메서드를 사용했습니다. 그렇다면 엔티티를 JAXB 주석에 정의 된 json으로 직렬화 할 수있는 방법은 무엇입니까? 즉 위의 예에서 응답을 {"entity":{"id":"xyz"}}과 같이 만들려면 어떻게해야합니까?

BTW, 나는 다음과 같은 종속성을 사용 :

'javax.servlet:javax.servlet-api:3.1.0' 
'org.slf4j:slf4j-api:1.7.25' 
'org.projectlombok:lombok:1.16.18' 
'javax.ws.rs:javax.ws.rs-api:2.1' 
'javax.xml.bind:jaxb-api:2.3.0' 
'org.eclipse.persistence:org.eclipse.persistence.moxy:2.7.0' 
'org.glassfish.jersey.containers:jersey-container-servlet:2.26' 
'org.glassfish.jersey.ext:jersey-spring4:2.26' 
'org.glassfish.jersey.core:jersey-server:2.26' 
'org.glassfish.jersey.media:jersey-media-moxy:2.26' 

내가 내 Mac에서 부두로 웹 응용 프로그램으로 내 실험 코드를 배포했습니다.

+1

Moxy 대신 Jackson을 사용하십시오. –

+0

@peeskillet 답장을 보내 주셔서 감사합니다. 방금 잭슨을 시험해 봤어. 불행히도 작동하지 않습니다. 같은 행동. – JBT

+1

MOXy를 제거 했습니까? –

답변

1

당신이 잭슨

'org.glassfish.jersey.media:jersey-media-moxy:2.26'

'org.glassfish.jersey에 대한 MOXY을 전환 할 경우 작동합니다 .media : jersey-media-json-jackson : 2.26 '

이유는 JAXB를 사용하는 MOXy가 유형 정보를 필요로하기 때문입니다. 타입 정보가 어떻게 발견되는지에 대한 정확한 발견 방법은 모르겠지만 경험상 찾아 낼 수없는 경우에는 toString()을 기본값으로 사용합니다.

반면에 잭슨은 기본적으로 bean properties을 조사하여 어떤 내용을 직렬화해야하는지 알기 때문에 형식 정보가 필요하지 않습니다.