2010-02-05 22 views
29

Utilizamos el enfoque "start from Java" para crear servicios web JAX-WS 2.0 utilizando la pila Metro 1.5. Cuando señalamos una herramienta estándar como SoapUI en uno de nuestros servicios web, indica que los parámetros de WebMethods son opcionales. El xsd generado muestra minOccurs = 0.Cómo puedo hacer que se necesite un parámetro de WebMethod

Necesito una forma de hacer que los parámetros de WebMethod sean necesarios (tal vez minOccurs = 1 en el xsd) en el enfoque "start from Java". Creo que hay una anotación Java para esto, pero no he podido encontrar ninguna. La anotación XmlElement tiene un atributo obligatorio, pero XmlElement no se puede aplicar a los parámetros de WebMethod.

¿Hay alguna manera de hacer que mis parámetros de WebMethod sean necesarios, salvo editar manualmente el xsd y establecer minOccurs en 1?

Respuesta

28

He verificado que Metro 2.0 le permite establecer @XmlElement(required=true) en un parámetro. El xsd generado no tiene minOccurs=0. Se deja minOccurs fuera de la xsd generada por lo que asume el valor predeterminado de 1.

Usted también tiene que actualizar su JDK poniendo el JAX-WS 2.2 webservices-api.jar en el directorio endorsed/.

Publiqué la misma pregunta on the Java forums.

Gracias a jitu tanto por la respuesta como por señalar que minOccurs se establece de manera predeterminada en 1, por lo que dejarlo fuera de .xsd tiene el efecto deseado.

Cuando @XmlElement (required = true) está establecido en el parámetro SoapUI ya no indica que el parámetro es opcional.

6

El xsd generado muestra minOccurs = 0.

Esto es por especificación: los elementos no primitivos son opcionales, solo se requieren primitivos.

Necesito una forma de hacer necesarios los parámetros de WebMethod (tal vez minOccurs = 1 en el xsd) en el enfoque "start from Java".

Esto no es posible, a menos que utilice primitivas como se mencionó anteriormente.

Y, de hecho, esta es una de las razones por las que Java primero chupa (sí, los desarrolladores les gusta pero it just does not work): es frágil, el contrato puede cambiar (!), No le da todo el control que necesita , no es fit well with WS-Security, etc. Así que, de hecho, contract-first no es agradable, pero al menos funciona.

+0

Gracias por los comentarios y los enlaces. Deseo que esos libros de servicios web hinchados (algunos de los cuales he leído, me refiero a vadeado) hubieran dicho esto tan claramente como ustedes. –

+0

@Dean De nada. Y gracias por los comentarios sobre JAX-WS 2.2 (incluso si esto no estaba realmente dentro del alcance de la pregunta inicial). –

+2

Diría que WSDL-first igualmente no funciona. El blog al que enlazas habla sobre el uso de objetos complejos de Solicitud y Retorno para envolver, pero esto presenta una serie de problemas, como ocultar cosas necesarias en los campos subyacentes, abuso de la reutilización, etc. ... luego, una vez más, me gustaría mantener una ejemplo de algo bueno como usar Spring y proxies para hacer que algo así como un WebService aparezca como una implementación simple de una interfaz localmente. Engullir su interfaz local de esta manera es parte de lo que le impide olvidarse de que es un servicio * que * se expone a través de JAX-WS. – jcalvert

2

Aquí hay otra discusión de esta misma pregunta. Según la respuesta, Metro 2.0 admite poner @XmlElement en un parámetro de método que debería resolver mi problema.

http://forums.java.net/jive/thread.jspa?messageID=385565&#385565

Metro 2.0 fue lanzado el 10 de diciembre de 2009, para que ya no está en EA. Lo intentaré y veré si funciona.

Cuestiones relacionadas