JAXB未编组SOAP响应
因此,我试图用JAXB和spring ws-webservicetemplate整理我的soap响应,但它不起作用,这是我的相关代码 SoapUI响应JAXB未编组SOAP响应,soap,jaxb,spring-ws,Soap,Jaxb,Spring Ws,因此,我试图用JAXB和spring ws-webservicetemplate整理我的soap响应,但它不起作用,这是我的相关代码 SoapUI响应 <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<getAccountProductsResponse xmlns="http://CellucomPosa/">
<getAccountProductsResult>
<CellucomPOSA xmlns="">
<Product>
<ProductID>280</ProductID>
<ProductName>AT&T $15</ProductName>
<Discount>18</Discount>
<Price>15.00</Price>
<ProdType>PINRTR</ProdType>
</Product>
<Product>
<ProductID>281</ProductID>
<ProductName>AT&T $25</ProductName>
<Discount>18</Discount>
<Price>25.00</Price>
<ProdType>PINRTR</ProdType>
</Product>
</CellucomPOSA>
</getAccountProductsResult>
</getAccountProductsResponse>
</soap:Body>
</soap:Envelope>
下面是发出请求的服务实现
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.oxm.XmlMappingException;
import org.springframework.stereotype.Service;
import org.springframework.ws.client.core.WebServiceTemplate;
import cellucomposa.GetAccountProductsResponse;
@Service
public class TcetraServiceImpl implements TcetraService {
private static final Logger logger = Logger.getLogger(TcetraServiceImpl.class);
@Autowired
private WebServiceTemplate webServiceTemplate;
@Override
public GetAccountProductsResponse getProducts(GetAccountProducts request) {
GetAccountProductsResponse response = (GetAccountProductsResponse) webServiceTemplate.marshalSendAndReceive(request);
return response;
}
}
请求没有问题,响应映射到pojo没有问题,没有任何错误,但CellucomPOSA元素始终为null,即使soapui响应显示为其他,并且soapui的请求对象与输入WebServiceTemplate的内容完全相同。知道这里可能出了什么问题吗?有人有任何输入吗?可能与名称空间或包信息有关。看起来响应以某种方式具有不同的名称空间,其中作为根节点的getAccountProductsResponse名称空间:所有对象都在同一个包中。名称空间是如何定义的?
package cellucomposa;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="getAccountProductsResponse")
public class GetAccountProductsResponse
{
@XmlElement(name="getAccountProductsResult", type=GetAccountProductsResult.class)
private GetAccountProductsResult getAccountProductsResult;
public GetAccountProductsResult getGetAccountProductsResult ()
{
return getAccountProductsResult;
}
public void setGetAccountProductsResult (GetAccountProductsResult getAccountProductsResult)
{
this.getAccountProductsResult = getAccountProductsResult;
}
}
package cellucomposa;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="getAccountProductsResult")
public class GetAccountProductsResult
{
@XmlElement(name="CellucomPOSA", type=CellucomPOSA.class)
private CellucomPOSA CellucomPOSA;
public CellucomPOSA getCellucomPOSA ()
{
return CellucomPOSA;
}
public void setCellucomPOSA (CellucomPOSA CellucomPOSA)
{
this.CellucomPOSA = CellucomPOSA;
}
}
package cellucomposa;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
@XmlRootElement(name="CellucomPOSA")
@XmlAccessorType(XmlAccessType.FIELD)
public class CellucomPOSA {
@XmlElement(name="Product", type=Product.class)
private Product[] Product;
public Product[] getProduct ()
{
return Product;
}
public void setProduct (Product[] Product)
{
this.Product = Product;
}
}
package cellucomposa;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Product")
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
@XmlElement(name="Price")
private String Price;
@XmlElement(name="ProductID")
private String ProductID;
@XmlElement(name="ProductName")
private String ProductName;
@XmlElement(name="Discount")
private String Discount;
@XmlElement(name="ProdType")
private String ProdType;
public String getPrice ()
{
return Price;
}
public void setPrice (String Price)
{
this.Price = Price;
}
public String getProductID ()
{
return ProductID;
}
public void setProductID (String ProductID)
{
this.ProductID = ProductID;
}
public String getProductName ()
{
return ProductName;
}
public void setProductName (String ProductName)
{
this.ProductName = ProductName;
}
public String getDiscount ()
{
return Discount;
}
public void setDiscount (String Discount)
{
this.Discount = Discount;
}
public String getProdType ()
{
return ProdType;
}
public void setProdType (String ProdType)
{
this.ProdType = ProdType;
}
}
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.oxm.XmlMappingException;
import org.springframework.stereotype.Service;
import org.springframework.ws.client.core.WebServiceTemplate;
import cellucomposa.GetAccountProductsResponse;
@Service
public class TcetraServiceImpl implements TcetraService {
private static final Logger logger = Logger.getLogger(TcetraServiceImpl.class);
@Autowired
private WebServiceTemplate webServiceTemplate;
@Override
public GetAccountProductsResponse getProducts(GetAccountProducts request) {
GetAccountProductsResponse response = (GetAccountProductsResponse) webServiceTemplate.marshalSendAndReceive(request);
return response;
}
}