2012-11-17 3 views
0

JAX-RS로 웹 서비스를 만들고 있습니다. JAXB 주석을 사용하여 도메인 모델에 주석을 달고 뒤로 몸을 기울여 전체 클래스가 XML/JSON으로 변환되는 것을 지켜 볼 수 있다는 것을 알고 있습니다. 그러나 이것은 내 응용 프로그램의 모든 시나리오에 적합하지 않습니다. 클래스가 XML에 마샬링되는 것이 항상 적절한 것은 아닙니다. 때로는 일부 필드 만 필요하며 도메인 모델에 표시되지 않은 맞춤 요소를 즉석에서 추가 할 수 있기를 원합니다.웹 서비스에서 사용자 정의 JSON/XML 응답을 만드는 방법

어떻게 하시겠습니까? 다른 프레임 워크를 사용해야합니까? 방금 GSON을 찾았습니다. 가치있는 것입니까? 내 리소스에 대한 XML 표현은 그다지 중요하지 않습니다. GSON을 사용하고 있다면 웹 서비스는 어떻게 응답해야합니까? 그렇다면 문자열을 반환 유형으로 사용 하시겠습니까?

가짜 코드, GSON을 아직 보지 않았습니다. 당신이 수익으로 javax.ws.rs.core.Response를 사용하는 멀티 변형 응답 유형의 자주 최선을 가질 경우에

@Produce("application/json") 
public String someMethod() { 
    return gson.toJSON(); 
} 
+0

나는 json과 저지를 사용하는 방법을 알고 있습니다. 지침을 원하십니까? –

+0

그들이 질문에 기초하여 원하는 것과 관련이 있다면 예. – LuckyLuke

+0

글쎄, 나는 내 답변에 GSon을 사용하지 않았지만 Jersey와 JSon에 대해 알고있는 바, 이것이 괜찮 으면 좋겠다. Jersey, Json 및 Gson이 아닌 RESTEasy를 사용하는 직장에서 말할 수 있지만 JAX-RS의 RI 인 Jersey와 함께 코드 스 니펫을 가져 오는 것이 좋습니다. –

답변

2

. 이렇게하면 런타임에 래핑되고 반환 될 실제 엔터티를 결정할 수있는 모든 권한이 부여됩니다.

그러면 자원 메소드가 호출 될 때 핵심 비즈니스 오브젝트 또는 비즈니스 오브젝트 주위의 랩퍼 또는 사용자 정의 직렬화 버전 (String)을 리턴 할 수 있습니다. 거친 의사 :이 방법의

@Produce("application/json") 
public Response someMethod() { 

    switch(mySpecialCase) { 
     case 1: 
      return Response.ok(coreEntity).build(); break; 
     case 2: 
      return Response.ok(new LiteEntity(coreEntity)).build(); break; 
     case 3: 
      return Response.ok(Util.toGSON(coreEntity).toString()).build(); break; 
    } 
} 

장점 중 하나는, 당신은 여전히 ​​JSON 및 XML로 직렬화를 즉석에서 활용할 수 있도록 해당 서버 측 인터셉터가 여전히 발생하고 엔티티 객체에 변환을 수행 것이다 동시에 엔티티 유형으로 문자열을 사용하여 번역을 우회 할 수 있습니다.

1

문자열은 반환하지 말고 형식을 반환해야합니다.

@Produces(MediaType.APPLICATION_JSON) 
public Person String getPerson() { 
    return personDao.getPerson(); 
} 

(예를 들어 받는다는 통해) 종속성을 추가하십시오에서 :
저지-JSON 단지 당신에 의해, 또한, 당신의 web.xml을 변경해야합니다 뉴저지에서 JSON의 지원을 시작
예를 들어
이 : 내 솔루션은 Person 클래스의 특별한 주석을 수행 할 필요가 없습니다 베어

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param> 

마음에
.

관련 문제