【发布时间】:2011-10-17 07:22:28
【问题描述】:
我已经像这样配置了我的 WebService:
应用上下文:
<sws:annotation-driven />
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" >
<property name="interceptors">
<list>
<bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/>
</list>
</property>
注意:拦截器在启动时加载,但如果有请求进来,则不会写入任何内容。
我有一个带有方法 addPersonRequest() 的 PersonServiceImpl 类。一切正常,如果我使用 org.dom4j.Element 作为方法参数;
@Endpoint
public class PersonServiceImpl {
@PayloadRoot(namespace = "http://www.example.org/person/schema", localPart = "AddPersonRequest")
@ResponsePayload
public AddPersonRequest addPersonRequest(@RequestPayload Element element) {
System.out.println(element.asXML());
Person response = new Person();
response.setId(2);
response.setFirstName("Mad");
response.setLastName("Mike");
return response;
}
}
但是,如果我更改我的方法参数,如下所示(因此应该使用 spring-ws 的自动编组),request.getFirstName() 将打印 null。 (JAXB2 在类路径上)。
Person 类使用@XMLType 和@XMLRootElement 进行注释。
注意:编组工作正常。
@Endpoint
public class PersonServiceImpl {
@PayloadRoot(namespace = "http://www.example.org/person/schema", localPart = "AddPersonRequest")
@ResponsePayload
public AddPersonRequest addPersonRequest(@RequestPayload Person request, SoapHeader header) {
System.out.println(header.getName());
System.out.println(request.getFirstName());
Person response = new Person();
response.setId(2);
response.setFirstName("Mad");
response.setLastName("Mike");
return response;
}
}
Person.java:
@XmlType
@XmlRootElement(namespace="http://www.example.org/person/schema", name="Person")
public class Person implements Serializable {
private int id;
private String firstName;
private String lastName;
@XmlElement
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@XmlElement
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@XmlAttribute
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
通过soapUI 发送的测试请求(从wsdl 生成):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sch="http://www.example.org/person/schema">
<soapenv:Header/>
<soapenv:Body>
<sch:AddPersonRequest>
<sch:Person sch:Id="1">
<sch:FirstName>firstname</sch:FirstName>
<sch:LastName>lastname</sch:LastName>
</sch:Person>
</sch:AddPersonRequest>
</soapenv:Body>
</soapenv:Envelope>
【问题讨论】:
-
你有日志拦截器吗?
-
不,我没有让它工作。在春季教程教程之后,我更改了我的 applicationContext 中的 Bean-Definition。(在原始帖子中所做的更改)。但是我的 Spring-WS 的 Logging-Level 设置为 TRACE,它告诉我:o.s.w.s.e.a.m.j.XmlRootElementPayloadMethodProcessor - Unmarshalled payload request to [mypackages.AddPersonRequest@a1557b],所以一切似乎都正常......
-
玩了一会儿之后,我得到了一个新异常:javax.xml.bind.UnmarshalException:意外元素(uri:“example.org/person/schema”,本地:“AddPersonRequest”)。预期的元素是 example.org/person/schema}Person> 也许有一个命名空间或本地部分问题,我没有看到?!
标签: web-services spring spring-ws