gpt4 book ai didi

web-services - Spring Web-Service 解码不起作用

转载 作者:行者123 更新时间:2023-12-04 05:23:23 25 4
gpt4 key购买 nike

我已经像这样配置了我的 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>

注意:拦截器在启动时加载,但不写任何东西,如果有请求进来。

我有一个 PersonServiceImpl 类,方法是 addPersonRequest()。一切正常,如果我使用 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;
}
}

人.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>

最佳答案

我不确定您是否还需要答案,请阅读您的最新评论。我对您的请求和响应负载感到有些困惑。他们好像被调换了。无论如何,如果没有 Person 类,这很难说。

不过,我之前处理过类似的问题,通过在实际类周围添加 JAXBElement<> 解决了这些问题。像这个片段:

@PayloadRoot(
localPart = "PutOrganisationUnitRequest",
namespace = DEFAULT_NAMESPACE
)
@ResponsePayload public JAXBElement<Response> putOrganisationUnits (
@RequestPayload JAXBElement<PutOrganisationUnitRequest> organisations,
MessageContext messageContext) {

您可以检查的另一件事是 jaxb 类和端点定义中的命名空间。

关于web-services - Spring Web-Service 解码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7790541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com