¿Cuál es la mejor manera de exponer un servicio WCF para que pueda ser consumido fácilmente de Java / CXF?

StackOverflow https://stackoverflow.com/questions/578970

  •  06-09-2019
  •  | 
  •  

Pregunta

Hemos escrito un servicio WCF para ser utilizado por una tienda de Java, que está utilizando CXF para generar los adaptadores. No estamos tan familiarizados con Java, pero hemos expuesto el servicio mediante basicHttpBinding, SSL y autenticación básica. Pruebas de integración muestran que un cliente .NET puede consumir el servicio muy bien. Sin embargo, la tienda de Java está teniendo problemas para consumir el servicio. En concreto, se getthe siguiente error JAXB: Dos declaraciones causan una colisión en la clase ObjectFactory. Esto es causado usualmente si 2 operaciones tienen el mismo nombre y espacio de nombres cuando CXF intenta crear clases de adaptador.

No podemos encontrar ningún nombre o tipo de operación que debe causar ningún tipo de colisión. Nos hemos asegurado de que todos los tipos personalizados especificar un espacio de nombres, y tempuri.org no se especifica en cualquier lugar en el WSDL. La tienda de Java sospecha que el error se debe a que el WSDL generado contiene

Por lo tanto, mis preguntas:

  • ¿Hay alguna forma mejor que CXF para la tienda de Java consumir el servicio WCF? Proyecto Tango parece interesante, pero no sé lo suficiente como para decirles que se considere el uso de la misma. CXF es un estándar de facto en Java?
  • BasicHttpBinding / SSL / autenticación básica son MS recomienda para los escenarios de interoperabilidad, pero el cliente todavía parece tener problemas de interoperabilidad. ¿Debemos considerar otras fijaciones o ajustes para hacer esto más fácil de consumir?
  • ¿Hay una manera de configurar WCF para siempre salida de un solo WDSL con ninguna importación de esquema?
¿Fue útil?

Solución

Las "dos declaraciones causar una colisión en el ObjectFactory clase" mensaje de error por lo general no tiene nada que ver con las importaciones. Ese es un mensaje de error JAXB que es causado generalmente por tener múltiples elementos o similares que hacen que los nombres de los campos generados sean los mismos. Por ejemplo, si tiene elementos como:

y

Esto puede causar que el error. Otra es usar algo como guiones y guiones bajos y de tal manera que por lo general se eliminan + tope: y

Con 2.1.4, puede intentar ejecutar la wsdl2java con la bandera -autoNameResolution. Que a veces ayuda con esto, pero no siempre. Desafortunadamente, la información que JAXB da en estos casos es casi inútil y muchas veces es sólo de prueba y error para encontrar los tipos de conflicto. : - (

Otros consejos

He desarrollé WCF con los clientes Axis2. Los métodos de autenticación que he utiliza con éxito es BasicHttpBinding / SSL / Básico (Transporte) y WS-Security con el nombre de usuario (y MTOM).

La aplicación de metro es utilizado por Sun y Microsoft para probar la interoperabilidad: http://weblogs.java.net/blog/haroldcarr/ archivo / 2007/11 / metro_web_servi.html

Lo sentimos ninguna pista sobre la importación generada por la WCF para la definición de esquema.

Estoy profundamente en Java Y WCF interoperabilidad. Como alguien más ha dicho que necesita para aplanar su WSDL si se está trabajando con WSDL basado en archivos. Sin embargo puedo usar Netbeans 6.5 y si apunta a una URL real como http: // myservice / WSDL , Netbeans puedo hacer frente fácilmente con el WSDL predeterminado generado por la WCF. En la vida real otras cosas que usted debe considerar es el control de versiones de servicio, datamembers opcionales (no va bien en Java, por lo que sugiero hacer todas datamembers isRequired = true), orden, etc.

La cosa difícil real para seguir adelante era la seguridad. Tuve que hacer el certificado de autenticación mutua de trabajo y que todavía tiene algunos problemas.

La única manera para que su cliente Java para hablar con un componente WCF será uno de los métodos HTTP - basicHttpBinding, WS *, etc al igual que recomienda MS. Java no puede hablar con WCF a través de TCP o NamedPipes o MSMQ, etc.

Yo empezaría con un súper simple componente WCF - algo con un único método que escupe una cadena. Consigue que el trabajo con Java y luego su forma de trabajo. Asegúrese de que todo lo que está exponiendo está trabajando con los tipos base o bien objetos definidos [DataContract].

El problema con xsd: import es muy común. Algunos juegos de herramientas o tiempos de ejecución no pueden hacer frente a eso. Para hacer frente a esto, se puede aplanar el WSDL que se genera por la WCF. Verificar este post .

En cuanto a si CXF es el derecho de pila Java - Nunca he oído hablar de él? He utilizado con éxito AXIS, así como JAX-WS. Ambos han sido bastante sencillo.

Este es un tema JAXB. Me encontré con el mismo problema, pero utiliza la opción xmlbeans lugar en la generación de clientes wsdl2java. Para ser honesto, parecen preferir los objetos más xmlbeans sobre jaxb en la medida de un consumidor a este servicio web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top