Не найдено сопоставление конечных точек для ..., используя SpringWS, JaxB Marshaller - PullRequest
2 голосов
/ 29 апреля 2010

Я получаю эту ошибку: не найдено сопоставление конечной точки для [SaajSoapMessage {http://mycompany/coolservice/specs}ChangePerson]

Ниже приведен мой конфигурационный файл ws:

<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
    <description>An endpoint mapping strategy that looks for @Endpoint and @PayloadRoot annotations.</description>
</bean>
<bean class="org.springframework.ws.server.endpoint.adapter.MarshallingMethodEndpointAdapter">
    <description>Enables the MessageDispatchServlet to invoke methods requiring OXM marshalling.</description>
    <constructor-arg ref="marshaller"/>
</bean>

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPaths"> 
    <list>
        <value>org.company.xml.persons</value>
        <value>org.company.xml.person_allextensions</value>
        <value>generated</value>
    </list>
    </property>
</bean>


<bean id="persons" class="com.easy95.springws.wsdl.wsdl11.MultiPrefixWSDL11Definition">   
    <property name="schemaCollection" ref="schemaCollection"/>                                               
    <property name="portTypeName" value="persons"/>                                
    <property name="locationUri" value="/ws/personnelService/"/>                              
    <property name="targetNamespace" value="http://mycompany/coolservice/specs/definitions"/>       
</bean>

<bean id="schemaCollection" class="org.springframework.xml.xsd.commons.CommonsXsdSchemaCollection">                   
    <property name="xsds">
    <list>
        <value>/DataContract/Person-AllExtensions.xsd</value>
        <value>/DataContract/Person.xsd</value>
    </list>
    </property>
     <property name="inline" value="true"/>      
</bean>

У меня есть следующие файлы:

public interface MarshallingPersonService {

public final static String NAMESPACE = "http://mycompany/coolservice/specs";
public final static String CHANGE_PERSON = "ChangePerson";

public RespondPersonType changePerson(ChangePersonType request);
}

и

  @Endpoint
  public class PersonEndPoint implements MarshallingPersonService {

    @PayloadRoot(localPart=CHANGE_PERSON, namespace=NAMESPACE)
    public RespondPersonType changePerson(ChangePersonType request) {
        System.out.println("Received a request, is request null? " + (request == null ? "yes" : "no"));
        return null;        
    }

}

Я довольно плохо знаком с WebServices и не очень доволен аннотациями.Я следую учебнику по настройке Jaxb Marshaller в Springws.Я предпочел бы использовать сопоставления XML, а не аннотации, хотя сейчас я получаю сообщение об ошибке.

РЕДАКТИРОВАТЬ: ChangePersonType

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ChangePersonType", propOrder = {
"applicationArea",
"dataArea"
})
public class ChangePersonType {

@XmlElement(name = "ApplicationArea", namespace = "http://mycompany/coolservice/specs", required = true)
protected TransApplicationAreaType applicationArea;
@XmlElement(name = "DataArea", namespace = "http://mycompany/coolservice/specs", required = true)
protected DataArea dataArea;
@XmlAttribute(required = true)
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
protected String releaseID;
@XmlAttribute
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
protected String versionID;

- Остальные являются геттерами и сеттерами.

1 Ответ

2 голосов
/ 29 апреля 2010

Я решил это. Параметр класса конечной точки и возвращаемой переменной должен был быть заключен в JAXBElement, как JAXBElement.

Причина в

Классы, сгенерированные JAXB2 из ваша схема бывает двух видов: которые имеют @XmlRootElement аннотация, которую можно использовать напрямую в качестве параметра или ответа, и те, кто этого не сделал. Те классы, которые нет этой аннотации должны быть завернутый в JAXBElement.

Помимо сгенерированных классов из ваша схема, JAXB2 также генерирует Класс ObjectFactory, который уточняет использование JAXBElement. Есть некоторые есть фабричные методы, которые проиллюстрировать, как вы можете использовать различные типы схем.

Арьен Поутсма h ttp: //forum.springsource.org/showthread.php? t = 49817

...