2012-06-20 28 views
5

tôi muốn đặt câu hỏi về @UsesJAXBContext chú thích trong jax-ws. Tôi cố gắng làm cho nó hoạt động trên phía khách hàng nhưng tôi có thể thiếu một cái gì đó. Đây là trường hợp của tôi:Cách đặt JAXBContext tùy chỉnh

Tôi đã có webservice với hoạt động:

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

Về phía khách hàng i tạo QueueService và Queue (port) ... và các công cụ khác ... [respones yêu cầu. Trong trường hợp này không liên quan.] Tôi muốn cho phép người dùng xác định đối tượng mà họ có thể đưa vào hàng đợi. Tuy nhiên để gọi hoạt động đặt (...) Tôi cần đối tượng liên kết (mà tôi cố gắng gửi) vào JAXBContext. Tôi có thể làm điều đó bằng cách @XmlSeeAlso ở đầu hàng đợi được tạo ra [tôi đã thử cái này và nó hoạt động]. Tuy nhiên tôi cần giải pháp chung chung hơn giúp tôi ràng buộc đối tượng trong thời gian chạy. Tôi nghĩ rằng tôi có thể tạo chú thích @QueueMessage ClientJAXBContextFactory và thêm lớp được đánh dấu vào ngữ cảnh khi tạo.

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); 
    } 
} 

Tiếp tôi đã cố gắng sử dụng @UsesJAXBContext trên đầu trang của tạo Queue.

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

Nhưng createJAXBContext (...) không gọi và JAX-WS chỉ đơn giản là tạo JAXBContextImpl mình.

Tôi đã đọc:

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

và một số câu hỏi về Stackoverflow. Tôi sẽ biết ơn những lời khuyên. Có thể triển khai ý tưởng được trình bày trong câu hỏi của tôi không?

Ngoài ra tôi có thể thêm điều đó ở phía máy chủ ... @UsesJAXBContext hoạt động. Nhưng điều quan trọng đối với tôi là làm cho nó hoạt động ở phía khách hàng.

Trả lời

5

Ok tôi có thể quản lý sự cố tôi đang gặp phải. Tôi vẫn không thể sử dụng @UsesJAXBContext với khách hàng sử dụng dịch vụ web. Nhưng tôi thấy rằng chú thích này được gắn với đậu với tính năng sau sửa lỗi. Vì vậy, có một lớp UsesJAXBContextFeature

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

và nó có thể được thông qua như là đối số của cổng hoặc dịch vụ (dịch vụ kể từ JAX-WS 2.2). Tôi đã có một chút rắc rối với các phiên bản vì vậy tôi quyết định tạo lớp và sử dụng jax-ws 2.1. Bây giờ tôi chỉ cần tạo cổng như thế này:

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

Và nó hoạt động!

Các vấn đề liên quan