2012-06-20 27 views
5

Chciałbym zadać pytanie dotyczące @UsesJAXBContext adnotacji w jax-ws. Staram się, aby działało po stronie klienta, ale prawdopodobnie czegoś brakuje. Oto mój przypadek:Jak ustawić niestandardowy JAXBContext

Mam usługa z eksploatacji:

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

Po stronie klienta i generowanego QueueService i Queue (port) ... i inne rzeczy ... [respones wnioski. W tym przypadku nieistotne.] Chciałbym pozwolić użytkownikowi zdefiniować obiekt, który mógłby umieścić w kolejce. Jednak aby wywołać operację, należy umieścić (...) Potrzebuję obiektu powiązania (który próbuję wysłać) do JAXBContext. Mogę to zrobić przez @XmlSeeAlso w górnej części wygenerowanego Queue Queue [próbowałem tego i działa]. Niemniej jednak potrzebuję bardziej ogólnego rozwiązania, które pomoże mi związać obiekt w czasie wykonywania. Pomyślałem, że mogę utworzyć adnotację @QueueMessage iClientJAXBContextFactory i dodać zaznaczoną klasę do kontekstu podczas jej tworzenia.

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

Następny próbowałem korzystanie @UsesJAXBContext na szczycie generowanego kolejce.

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

Ale createJAXBContext (...) nie jest wywoływany i JAX-WS po prostu stworzyć swój JAXBContextImpl.

Znam:

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

a niektóre pytanie na StackOverflow. Byłbym wdzięczny za rady. Czy można zrealizować pomysł przedstawiony na moje pytanie?

Również mogę dodać, że po stronie serwera ... @UsesJAXBContext działa. Ale jest to dla mnie ważne, aby działało po stronie klienta.

Odpowiedz

5

OK Mogłem poradzić sobie z problemem, z jakim miałem styczność. Nadal nie mogłem używać @UsesJAXBContext z klientem korzystającym z usługi internetowej. Ale stwierdziłem, że te adnotacje są powiązane z fasolami z funkcją Post-fix. Więc istnieje klasa UsesJAXBContextFeature

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

i może być przekazany jako argument portu lub (usługa od JAX-WS 2.2). Mam małe problemy z wersjami, więc zdecydowałem się wygenerować klasę i użyć jax-ws 2.1. Teraz po prostu utworzę taki port:

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

I działa!