2012-06-20 11 views
5

me gustaría hacer una pregunta acerca de @UsesJAXBContext anotación en jax-ws. Intento que funcione en el lado del cliente, pero probablemente me esté perdiendo algo. Aquí es mi caso:Cómo configurar JAXBContext

Tengo servicio web con la operación:

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

En el cliente me genera QueueService y cola (puerto) ... y otras cosas ... [respones solicitudes. En este caso, es irrelevante.] Me gustaría que el usuario defina el objeto que él/ella podría poner en cola. Sin embargo, para invocar la operación ponga (...) Necesito vincular el objeto (que intento enviar) a JAXBContext. Podría hacerlo por @XmlSeeAlso en la parte superior del tallo de cola generado [probé este y funciona]. No obstante, necesito una solución más genérica que me ayude a unir objetos en tiempo de ejecución. Pensé que podría crear la anotación @QueueMessage y ClientJAXBContextFactory y agregar una clase marcada al contexto al crearlo.

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

siguiente intenté uso @UsesJAXBContext en la parte superior de la cola generada.

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

Pero createJAXBContext (...) no se invoca y JAX-WS simplemente crear su JAXBContextImpl.

he leído:

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

y alguna cuestión en StackOverflow. Estaría agradecido por los consejos. ¿Es posible implementar la idea presentada en mi pregunta?

También podría agregar que en el lado del servidor ... @UsesJAXBContext funciona. Pero es importante para mí hacer que funcione en el lado del cliente.

Respuesta

5

Ok Pude solucionar el problema que estaba enfrentando. Todavía no pude usar @UsesJAXBContext con el cliente consumiendo el servicio web. Pero descubrí que estas anotaciones están vinculadas a los frijoles con función post-corrección. Así que hay una clase UsesJAXBContextFeature

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

y podría ser pasado como argumento del puerto o de servicios (servicio desde JAX-WS 2.2). Tengo un pequeño problema con las versiones, así que decidí generar clases y usar jax-ws 2.1. Ahora simplemente creo un puerto como este:

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

Y funciona!