2010-09-03 13 views
11

Deseo crear un servicio SOAP con múltiples tipos de puertos expuestos, donde cada tipo de puerto tiene una interfaz separada. Estoy tratando de hacer esto usando JAX-WS 2.0.Publicar varios puertos con un servicio utilizando JAX-WS 2.0 y @WebService

Ejemplo:

interface A: 
    ObjectA get(String name); 

interface B: 
    ObjectB get(String name); 

Service: 
    port A 
      get 
    port B 
      get 

El problema que estoy teniendo es que un @WebService se define utilizando una sola clase/interfaz, por lo que la única manera de que soy capaz de configurar esto es que tiene dos servicios separados . Cada servicio implementado por una clase separada con una anotación @WebService.

Me gustaría exponer ambos puertos con el mismo servicio, para dejar en claro que ambos forman parte de la misma API. es posible?

Realmente, lo que busco es tener algún tipo de soporte de espacio de nombres anidado en el WSDL, así que puedo tener los mismos métodos en diferentes espacios de nombres. Tendré métodos get/set/delete para diferentes tipos de datos uno al lado del otro, pero prefiero no ponerlos todos en la misma gran interfaz con getA/getB y demás, ya que me gustaría poder para agregar nuevos tipos de datos más adelante sin forzar a todos los clientes a regenerarse a partir del nuevo conjunto de WSDL. Cualquier sugerencia para lograr esto es bienvenido, incluso si esto significa usar otra forma de generar el WSDL a partir del código java.

Respuesta

1

Puede intentar cambiar el nombre de uno de los métodos y establecer los campos action o operationName en la anotación @WebMethod explícitamente.

1

Yo sugeriría en lugar de definir el parámetro de entrada como una cadena, se debe considerar la definición de un RequestType (un complexType en xsd), para cada uno de esos métodos y que le daría las siguientes ventajas:
1. Si tiene un tipo complejo definido, entonces la solicitud puede evolucionar de forma independiente donde se agregan más elementos en el tipo complejo, mientras que la firma del método web no cambia en el wsdl.
2. Puede tener el mismo nombre para los 2 métodos que tiene arriba (digamos get (...)), mientras que los dos tendrán los diferentes tipos de solicitud. Puede lograr esto definiendo los dos elementos diferentes en el xsd (con el mismo espacio de nombre) con diferentes nombres de solicitud. Si desea tener el mismo nombre para los elementos de solicitud, debe considerar definirlos en diferentes espacios de nombres. De esta forma, en OOP, se generarán en diferentes paquetes y, por lo tanto, pueden tener el mismo nombre.

En una nota diferente, sugeriría que siempre es bueno tener los nombres de sus operaciones y los nombres de los mensajes tan únicos y específicos como sea posible.

0

La sobrecarga de funciones no se aceptará en los servicios web. Quiero decir que no se puede hacer una operación múltiple con el mismo nombre. Necesita el mismo puerto y el mismo nombre de operación para devolver objetos de la clase diferente; puede intentar lo siguiente.

interfaz

public interface OB { 
public Object get(String name); 
} 

servicio web

@Override 
@WebMethod 
public Object get(String name) { 
    if(name.equals("A")){ 
     return new ObjectA("A"); 
    }else if(name.equals("B")){ 
     return new ObjectB(1); 
    }else { 
     return null; 
    } 
} 

En este caso hay que identificar qué clase de objeto tiene que ser de regresar de la solicitud y luego construirlo y volviendo la espalda es una de las formas.

Cuestiones relacionadas