Pregunta

¿Es posible crear una operación de servicio web utilizando tipos de Java primitivos o básicos cuando se usa JaxB2MarsChaller en Spring-WS? Por ejemplo, un método que se ve así:

@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public long addTask(final Task task) throws AddTaskFault {
 // do something
 return 0;
}

Estoy usando el complemento Maven Jaxws para generar las clases de interfaz y modelo de mi WSDL. Cuando intento llamar al servicio web recibo el siguiente error:

java.lang.illegalStateException: No hay adaptador para el punto final [...]: ¿Su punto final implementa una interfaz compatible como MessageHandler o PayOgEndpoint

Descubrí que si cambio el método a eso:

@Override
@PayloadRoot(localPart = "AddTaskRequest", namespace = "http://example.com/examplews/")
public JAXBElement<Long> addTask(final JAXBElement<Task> task) throws AddTaskFault {
 final ObjectFactory objectFactory = new ObjectFactory();
 return objectFactory.createAddTaskResponse(0L);
}

Puedo llamarlo, pero esta firma no es compatible con la interfaz generada por el complemento Maven Jaxws.

¿Qué puedo hacer para configurar Spring-WS para poder usar el primer tipo de implementación o para decirle al complemento Maven Jaxws que genere la segunda variante de la interfaz?

ACTUALIZACIÓN: Mis entradas de configuración de Spring-WS relevantes se ven así:

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
 <property name="contextPath" value="com.example.examplews" />
</bean>

<bean class="org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter">
 <constructor-arg ref="marshaller" />
</bean>

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
 <property name="order" value="1" />
</bean>
¿Fue útil?

Solución

Cuando Spring-WS está tratando de igualar un EndpointAdapter a una Endpoint, verifica que todos los parámetros del método de punto final, más su valor de retorno, son tipos conocidos por el Jaxb2Marshaller, y long no lo haré. Conceptualmente, esto tiene sentido, ya que Jaxb no tendría idea de cómo convertir un long en XML sin más información (que es donde JAXBElement viene en).

Deberías darte cuenta de que Spring-WS es no Una implementación de Jax-WS y no pretende ser. Realmente no puede esperar tomar artefactos generados por JAX-WS y esperar que solo funcionen en Spring_WS, aunque en muchos casos Spring-WS es lo suficientemente flexible como para lidiar con eso.

Otros consejos

Aquí está todo lo relevante en mi configuración, ya que realmente no puedo decir lo que podría cambiar, son bastante diferentes y ha pasado un año y medio desde que hice esto.

    <bean id="schemaCollection"
        class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">
        <property name="xsds" value="/my.xsd" />
        <property name="inline" value="true" />
    </bean>

    <bean id="marshallingEndpoint"
        class="....EndpointImpl">
    </bean>

    <oxm:jaxb2-marshaller id="marshaller" contextPath=".....schema" />

   <bean id="annotationMapping"      class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
        <property name="interceptors">
            <list>
                <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" />
                <bean class="org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor">
                    <property name="xsdSchemaCollection"
                        ref="schemaCollection" />
                    <property name="validateRequest" value="true" />
                    <property name="validateResponse" value="true" />
                </bean>
            </list>
        </property>
        <property name="order" value="1" />
    </bean>

    <sws:marshalling-endpoints />

Espero que ayude de alguna manera. La clase de punto final tenía @Endpoint, los métodos @payloadroot. No regresaron mucho, pero tampoco tuve que envolver mi clase en el JaxBelement.

editar] espacios de nombres

    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xmlns:sws="http://www.springframework.org/schema/web-services"

    xsi:schemaLocation="
       http://www.springframework.org/schema/oxm 
       http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd">
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top