2012-06-20 2 views
5

Я хотел бы задать вопрос о @UsesJAXBContext аннотация в jax-ws. Я пытаюсь заставить его работать на стороне клиента, но я, вероятно, что-то пропустил. Вот мой случай:Как установить пользовательский JAXBContext

У меня есть веб-сервиса с работы:

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

На стороне клиента я генерируемой QueueService и Queue (порт) ... и другие вещи ... [запросы акустический отклик. В этом случае не имеет значения.] Я хотел бы дать пользователю определить объект, который он/она может поставить в очередь. Однако для вызова операции 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

и какой-то вопрос на StackOverflow. Я был бы благодарен за советы. Возможно ли реализовать идею, представленную в моем вопросе?

Также я мог бы добавить, что на стороне сервера ... @UsesJAXBContext работает. Но для меня важно, чтобы он работал на стороне клиента.

ответ

5

Хорошо, я мог справиться с проблемой, с которой я столкнулся. Тем не менее я не мог использовать @UsesJAXBContext с клиентом, использующим веб-сервис. Но я обнаружил, что эти аннотации привязаны к beans с функцией post-fix. Так есть класс 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())); 

И это работает!