2012-02-23 25 views
5

Utilizamos cxf 2.5.2 junto con la primavera para exponer y consumir servicios de descanso. para la distribución de las clases de interfaz de servicio, que comenzó a usar objetivo wadl2java (que genera clases de interfaz basados ​​en el archivo WADL dado)CXF JAXRS | Los tipos de respuesta complejos no están presentes en el wadl generado

el imposible de WADL generadas tienen el tipo de respuesta adecuada, a causa de lo que supongo, las interfaces generadas todos tienen 'Respuesta' como el tipo de devolución.

Ej. Si el método GET de descanso devuelve 'Lista', el WADL generado contiene sólo el segmento siguiente:

<response><representation mediaType="application/json"/></response>

y la interfaz correspondiente generada a partir de este archivo WADL contiene el tipo de retorno como 'Respuesta'

Puede ¿alguien sugiere lo que se debe hacer para evitar que el tipo de respuesta real se pierda? ¿Se requieren alguna anotación (como ElementClass? ¿Cómo se usa?) O se requieren proveedores?

código actual:

@GET 
@Path("/itemsForCategory") 
@Produces("application/json") 
@Description("getItemsForCategory") 
public List<Item> getItemsForCategory(@QueryParam("category")String category) { 
+0

Se encontró http://cxf.547215.n5.nabble.com/Problem-with-WADL-generation-and-returning-a-List-of-objects-td4713351.html#a5507490. No estoy seguro si se ha solucionado – crankparty

Respuesta

-1

que tenía problemas similares cuando se trata de listas, mapas, etc. Debido a que las colecciones no conocen su tipo en tiempo de ejecución cuando se genera un WSDL se tienen en cuenta los tipos que se pone en la colección . La excepción a esto, descubrí, fue cuando otro método expuesto del servicio web usó ese tipo particular. Como solución alternativa, creé un método ficticio que utilizaba todos los tipos que necesitaba para listas y mapas.

Así que, por ejemplo, tuve una clase llamada Usuario que extendía una clase abstracta llamada BaseObject que no era utilizada directamente por el servicio web. Sin embargo, en ocasiones se pasaba por listas cuando se buscaban usuarios. El siguiente código fue mi solución.

@WebService 
public interface MyService 
{ 
    // Various @WebMethods here 

    /** 
    * This method should not be used. This is a workaround to ensure that 
    * User is known to the JAXB context. Otherwise you will get exceptions like this: 
    * javax.xml.bind.JAXBException: class java.util.User nor any of its super class is known to this context. 
    * Or it will assume that using BaseObject is OK and deserialisation will fail 
    * since BaseObject is abstract. 
    * This issue occurs because the classes available to the JAXB context 
    * are loaded when the endpoint is published. At that time it is not known 
    * that User will be needed since it is not explicitly referenced 
    * in any of these methods. Adding user here will cause it to be added to 
    * the context. 
    * @param user 
    * @return 
    */ 
    @WebMethod 
    void dummy(@WebParam(name="user") User user); 
} 

Admito que esto es un poco de una obra desagradable alrededor y no lo consideran una solución adecuada, pero tal vez va a seguir jugando hasta que alguien pueda ofrecer una mejor solución.

Espero que esto ayude.

2

El tipo de devolución "Respuesta" genérico parece no estar relacionado con el hecho de que está tratando de devolver una lista. Es decir, incluso el uso de "Artículo" como el tipo de devolución daría lugar a un método en la interfaz generada con un tipo de respuesta de "Respuesta". Para remediar esto, es necesario añadir el atributo de elemento en la respuesta de recursos WADL:

<response><representation mediaType="application/json" element="item"/></response> 

Esto funciona si modifica el WADL directamente, una anotación JAX-RS equivalente puede o no puede estar avalado. Esto tampoco soluciona el problema al devolver una lista. Mi sugerencia (que he utilizado anteriormente) es crear un tipo de lista de contenedor (por ejemplo, Lista de artículos) que encapsula el tipo de devolución de la lista.

En cualquier caso, tendrá que voltear desde una implementación de abajo hacia arriba (es decir, WADL primero). Esto no debería ser tan malo, ya que ya tiene la implementación y puede hacer que implemente la interfaz generada.

Para aclarar todo esto, hice un proyecto de ejemplo simple basado en el ejemplo estándar de "librería" de JAX-RS. Puede ver el pom (con la configuración de wadl2java) y el wadl real en github. El código generado también está allí (por ejemplo, BookstoreidResource.java).

+0

El repositorio ya no existe –

Cuestiones relacionadas