2012-06-20 2 views
5

@UsesJAXBContext annotation in jax-ws에 대해 질문하고 싶습니다. 나는 그것을 클라이언트 측에서 작동 시키려고 노력하지만 나는 아마 뭔가를 놓친다. 내가 작업과 웹 서비스를 가지고커스텀 JAXBContext 설정 방법

: 내가 QueueService 및 대기열 (포트) ... 및 기타 물건을 생성 한 클라이언트 측에

@WebMethod(operationName = "putToQueue") 
public boolean put(@WebParam(name = "queueName") String queueName, @WebParam(name = "element") Object element) { 
    return queues.get(queueName).offer(element); 
} 

... [respones 요청 여기 내 경우입니다. 이 경우 관련 없음.] 사용자가 큐에 넣을 수있는 개체를 정의 할 수있게하려고합니다. 그러나 조작을 호출하려면 put (...) JAXBContext에 바인드 객체 (전송하려고 함)가 필요합니다. 그걸로 할 수있는 @ XmlSeeAlso 생성 된 큐 스텁의 상단에 [나는 이것을 시도하고 그것을 작동]. 그럼에도 불구하고 런타임시 객체를 바인딩하는 데 도움이되는보다 일반적인 솔루션이 필요합니다. @QueueMessage 주석 및 ClientJAXBContextFactory을 만들고이를 생성 할 때 표시된 클래스를 컨텍스트에 추가 할 수 있다고 생각했습니다.

public class ClientJAXBContextFactory implements JAXBContextFactory { 

    @Override 
    public JAXBRIContext createJAXBContext(SEIModel seim, List<Class> classes, List<TypeReference> references) throws JAXBException { 
     Reflections reflections = new Reflections(""); 
     Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(QueueMessage.class); 
     classes.addAll(annotated); 

     return JAXBContextFactory.DEFAULT.createJAXBContext(seim, classes, references); 
    } 
} 

다음 제가

생성 큐 위에 @UsesJAXBContext 사용 시도.

@WebService(name = "Queue") 
@UsesJAXBContext(ClientJAXBContextFactory.class) 
public interface Queue { 
... 
} 

그러나 createJAXBContext (...)가 호출되지 않고, JAX-WS는 단지 자신의 JAXBContextImpl을 만들 수 있습니다.

은 내가 읽고 :

http://weblogs.java.net/blog/jitu/archive/2008/08/control_of_jaxb.html

http://www.techques.com/question/1-5627173/Specify-JAXB-Packages-in-SLSB-and-JAX-WS

와 유래에 대한 몇 가지 질문입니다. 나는 조언에 감사 할 것이다. 내 질문에 제시된 아이디어를 구현할 수 있습니까?

또한 서버쪽에 추가 할 수 있습니다 ... @UsesJAXBContext 작품. 그러나 클라이언트 측에서 작동하게 만드는 것이 중요합니다.

답변

5

좋아, 내가 직면 한 문제를 관리 할 수 ​​있었다. 아직도 나는 @UsesJAXBContext을 클라이언트가 웹 서비스를 사용하면서 사용할 수 없었다. 하지만이 주석은 포스트 픽스 기능으로 빈에 묶여있는 것으로 나타났습니다. 그래서이 클래스 UsesJAXBContextFeature에게

https://jax-ws.java.net/nonav/2.2.7/javadocs/com/sun/xml/ws/developer/UsesJAXBContextFeature.html

입니다 그것은 (JAX-WS 2.2 이후 서비스) 포트 또는 서비스의 인수로 전달 될 수있다. 나는 버전을 약간 문제가있어서 클래스를 생성하고 jax-ws 2.1을 사용하기로 결정했다. 이제 간단히 포트를 만들면됩니다.

new QueueService().getQueuePort(new UsesJAXBContextFeature(new ClientJAXBContextFactory())); 

그리고 작동합니다!