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에서 부두로 웹 응용 프로그램으로 내 실험 코드를 배포했습니다.
Moxy 대신 Jackson을 사용하십시오. –
@peeskillet 답장을 보내 주셔서 감사합니다. 방금 잭슨을 시험해 봤어. 불행히도 작동하지 않습니다. 같은 행동. – JBT
MOXy를 제거 했습니까? –