2012-02-23 9 views
5

우리는 cxf 2.5.2를 봄과 함께 사용하여 편안한 서비스를 제공하고 소비합니다. 서비스 인터페이스 클래스를 배포하기 위해 wadl2java goal (주어진 wadl 파일을 기반으로 인터페이스 클래스를 생성 함)을 사용하기 시작했습니다.CXF JAXRS | 복잡한 응답 유형은 생성 된 객체에 없습니다.

생성 된 wadl에는 적절한 응답 유형이 포함되어 있지 않으므로 생성 된 인터페이스에는 모두 반환 유형으로 '응답'.

Ex. '응답'

수 등의 반환 형식을

<response><representation mediaType="application/json"/></response>

이 WADL 파일에서 생성 된 해당 인터페이스가 포함되어 평온한 get 메소드 반환 '목록'경우, 생성 된 WADL는 다음과 같은 경우에만 세그먼트를 포함 실제 응답 유형이 손실되지 않도록하기 위해 수행해야 할 작업을 제안하는 사람이 있습니까? ElementClass와 같은 주석 (사용법)이나 제공자가 필요합니까?

현재 코드 : 당신이 컬렉션에 넣어 유형은 무시됩니다 WSDL을 생성 할 때 컬렉션이 실행시에 자신의 유형을 알고하지 않기 때문에리스트,지도 등을 처리 할 때

@GET 
@Path("/itemsForCategory") 
@Produces("application/json") 
@Description("getItemsForCategory") 
public List<Item> getItemsForCategory(@QueryParam("category")String category) { 
+0

발견 http://cxf.547215.n5.nabble.com/Problem-with-WADL-generation-and-returning-a-List-of-objects-td4713351.html#a5507490. 고정되어 있는지 확실하지 않음 – crankparty

답변

-1

나는 비슷한 문제가 있었다 . 이것에 대한 예외는 다른 웹 서비스 노출 메소드가 특정 유형을 사용했을 때였 다. 내가 해결할 수있는 방법으로 목록과 맵에 필요한 모든 유형의 더미 메소드를 만들었습니다.

예를 들어 Webservice에서 직접 사용하지 않은 BaseObject라는 추상 클래스를 확장 한 User라는 클래스가있었습니다. 그러나 사용자를 검색 할 때 목록을 통과하는 경우가 있습니다. 다음 코드는 내 해결 방법입니다.

@WebService 
public interface MyService 
{ 
    // Various @WebMethods here 

    /** 
    * This method should not be used. This is a workaround to ensure that 
    * User is known to the JAXB context. Otherwise you will get exceptions like this: 
    * javax.xml.bind.JAXBException: class java.util.User nor any of its super class is known to this context. 
    * Or it will assume that using BaseObject is OK and deserialisation will fail 
    * since BaseObject is abstract. 
    * This issue occurs because the classes available to the JAXB context 
    * are loaded when the endpoint is published. At that time it is not known 
    * that User will be needed since it is not explicitly referenced 
    * in any of these methods. Adding user here will cause it to be added to 
    * the context. 
    * @param user 
    * @return 
    */ 
    @WebMethod 
    void dummy(@WebParam(name="user") User user); 
} 

나는이 주위에 불쾌한 약간의 작업이다 인정하고 나는 그것을 적절한 수정을 고려하지 않지만, 누군가가 더 나은 솔루션을 제공 할 수있을 때까지 어쩌면가는 당신을 유지합니다.

희망이 도움이됩니다.

2

일반 "응답"리턴 유형은 목록을 리턴하려고한다는 사실과 관련이없는 것처럼 보입니다. 즉, "Item"을 반환 형식으로 사용하더라도 반환 된 형식이 "Response"인 생성 된 인터페이스의 메서드가됩니다. 이 문제를 해결하려면, 당신은 WADL 자원 응답 요소의 속성을 추가해야합니다 직접 WADL을 수정하면

<response><representation mediaType="application/json" element="item"/></response> 

이 이에 상응하는 JAX-RS 주석이되거나 지원되지 않을 수 있습니다 작동합니다. 이것은 또한 목록을 반환하는 문제를 해결하지 못합니다. 필자가 제안한 제안은 List 반환 유형을 캡슐화하는 래퍼 목록 유형 (예 : ItemList)을 만드는 것입니다.

두 경우 모두 아래에서 위로 아래로 이동 (즉, WADL 구현)해야합니다. 이미 구현되어 있고 생성 된 인터페이스를 구현할 수 있기 때문에 너무 나쁘지 않아야합니다.

이 모든 것을 명확히하기 위해 표준 JAX-RS "서점"예제를 기반으로 간단한 예제 프로젝트를 만들었습니다. pom (wadl2java 구성 사용) 및 실제 wadl은 github에서 볼 수 있습니다. 생성 된 코드도 여기에 있습니다 (예 : BookstoreidResource.java).

+0

더 이상 repo가 ​​존재하지 않습니다. –