如何解决SOAP请求编组器无响应
我正在尝试用Jaxb2Marshaller发送一个JAXBElement请求。我使用WSIMPORT从wsdl文件生成带有类的.jar。它产生了例如OBjectFactory.class,DocumentDataType.class,DocumentResponse.class,DocumentType.class。在对swagger doc ui的响应中,我收到了发送回的DocumentDataType,而不是DocumentResponse。我也无法直接与编组器发送DocumentDataType,因为它缺少@XmlRootElement。因此,我正在使用ObjectFactory createDocumentData。我已删除了该帖子的网址。
主要问题是我没有收到来自SOAP请求的车辆数据响应。
@XmlElementDecl(
namespace = "http://...com/",name = "documentData"
)
public JAXBElement<DocumentDataType> createDocumentData(DocumentDataType var1) {
return new JAXBElement(_DocumentData_QNAME,DocumentDataType.class,(Class)null,var1);
}
在SOAP UI上,项目设置和请求都可以正常工作,并且在发送DocumentDataType之后,会有车辆数据的响应,但是在我的Java Spring Boot项目中却没有。我实施它的方法是否正确,还是有更好的方法?
我的配置类
@Configuration
public class MBOConfig {
private final String WS_URL = "https://../ws/v1/AppraisalService";
@Bean
public SaajSoapMessageFactory messageFactory() {
SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory();
messageFactory.setSoapVersion(SoapVersion.SOAP_12);
return messageFactory;
}
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com...");
return marshaller;
}
@Bean
public MBOService mboService(Jaxb2Marshaller marshaller) {
MBOService service = new MBOService();
service.setDefaultUri(WS_URL);
service.setMarshaller(marshaller);
service.setUnmarshaller(marshaller);
service.setMessageFactory(messageFactory());
service.setInterceptors(new ClientInterceptor[]{securityInterceptor()});
return service;
}
@Bean
public Wss4jSecurityInterceptor securityInterceptor() {
Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
wss4jSecurityInterceptor.setSecurementPasswordType("PasswordText");
wss4jSecurityInterceptor.setSecurementActions(WSHandlerConstants.TIMESTAMP);
wss4jSecurityInterceptor.setSecurementActions(WSHandlerConstants.USERNAME_TOKEN);
wss4jSecurityInterceptor.setSecurementUsername("user");
wss4jSecurityInterceptor.setSecurementPassword("password");
wss4jSecurityInterceptor.setSecurementUsernameTokenNonce(true);
wss4jSecurityInterceptor.setSecurementUsernameTokenCreated(true);
return wss4jSecurityInterceptor;
}
}
控制器类
@RestController
public class DocumentController {
@Autowired
private MBOService services;
@PostMapping("/marshal")
public JAXBElement<DocumentResponse> sendDocument() {
return services.sendDocument();
}
}
服务等级
public class MBOService extends WebServiceGatewaySupport {
private static final Logger LOG = LoggerFactory.getLogger(MBOService.class);
private final String WS_URL = "https://../ws/v1/AppraisalService";
public JAXBElement<DocumentResponse> sendDocument() {
JAXBElement<DocumentDataType> documentDataType = new ObjectFactory().createDocumentData(prepareDocument());
JAXBElement<DocumentResponse> documentResponse = (JAXBElement<DocumentResponse>) getWebServiceTemplate()
.marshalSendAndReceive(WS_URL,documentDataType);
return documentResponse;
}
public DocumentDataType prepareDocument() {
File file = createDummyFile();
DocumentDataType data = new DocumentDataType();
data.setClientCode("000011");
data.setVin("WDD1179081N775710");
data.setCorrelationID("123");
data.setVersion("1");
DocumentType document = new DocumentType();
try {
document.setDocumentData(Files.readAllBytes(file.toPath()));
document.setFilename(file.getName());
data.getDocuments().add(document);
} catch (IOException e) {
LOG.error("could not add file");
}
return data;
}
private File createDummyFile() {
File file = new File("./dummy.pdf");
try {
if (file.createNewFile()) {
LOG.info("file created");
}
} catch (IOException e) {
LOG.error("unable to create dummy file.");
}
return file;
}
}
DocumentDataType类
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "documentDataType",propOrder = {"clientCode","vin","correlationID","version","documents"}
)
public class DocumentDataType {
protected String clientCode;
@XmlElement(
required = true
)
protected String vin;
@XmlElement(
required = true
)
protected String correlationID;
@XmlElement(
required = true
)
protected String version;
@XmlElement(
nillable = true
)
protected List<DocumentType> documents;
public DocumentDataType() {
}
public String getClientCode() {
return this.clientCode;
}
public void setClientCode(String var1) {
this.clientCode = var1;
}
public String getVin() {
return this.vin;
}
public void setVin(String var1) {
this.vin = var1;
}
public String getCorrelationID() {
return this.correlationID;
}
public void setCorrelationID(String var1) {
this.correlationID = var1;
}
public String getVersion() {
return this.version;
}
public void setVersion(String var1) {
this.version = var1;
}
public List<DocumentType> getDocuments() {
if (this.documents == null) {
this.documents = new ArrayList();
}
return this.documents;
}
}
DocumentResponse类
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
name = "",propOrder = {"overalStatus","status"}
)
@XmlRootElement(
name = "documentResponse"
)
public class DocumentResponse {
protected int overalStatus;
@XmlElement(
required = true
)
protected List<ResponseType> status;
public DocumentResponse() {
}
public int getOveralStatus() {
return this.overalStatus;
}
public void setOveralStatus(int var1) {
this.overalStatus = var1;
}
public List<ResponseType> getStatus() {
if (this.status == null) {
this.status = new ArrayList();
}
return this.status;
}
}
ObjectFactory类
@XmlRegistry
public class ObjectFactory {
private static final QName _AppraisalData_QNAME = new QName("http://...com/","appraisalData");
private static final QName _ServiceFault_QNAME = new QName("http://...com/","serviceFault");
private static final QName _DocumentData_QNAME = new QName("http://...com/","documentData");
public ObjectFactory() {
}
public AppraisalDataType createAppraisalDataType() {
return new AppraisalDataType();
}
public AppraisalResponse createAppraisalResponse() {
return new AppraisalResponse();
}
public ResponseType createResponseType() {
return new ResponseType();
}
public DocumentResponse createDocumentResponse() {
return new DocumentResponse();
}
public DocumentDataType createDocumentDataType() {
return new DocumentDataType();
}
public TireDataType createTireDataType() {
return new TireDataType();
}
public DocumentType createDocumentType() {
return new DocumentType();
}
public DamageDetailType createDamageDetailType() {
return new DamageDetailType();
}
public TireSetDataType createTireSetDataType() {
return new TireSetDataType();
}
public MissingPartType createMissingPartType() {
return new MissingPartType();
}
public SingleDamageType createSingleDamageType() {
return new SingleDamageType();
}
public ServiceFaultType createServiceFaultType() {
return new ServiceFaultType();
}
@XmlElementDecl(
namespace = "http://...com/",name = "appraisalData"
)
public JAXBElement<AppraisalDataType> createAppraisalData(AppraisalDataType var1) {
return new JAXBElement(_AppraisalData_QNAME,AppraisalDataType.class,var1);
}
@XmlElementDecl(
namespace = "http://...com/",name = "serviceFault"
)
public JAXBElement<ServiceFaultType> createServiceFault(ServiceFaultType var1) {
return new JAXBElement(_ServiceFault_QNAME,ServiceFaultType.class,var1);
}
}
等级依赖性
dependencies {
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// Lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// Tomcat REST services mvc web layer
implementation 'org.springframework.boot:spring-boot-starter-web'
// SOAP services
implementation 'org.springframework.boot:spring-boot-starter-web-services'
// Springdoc openapi ui
implementation 'org.springdoc:springdoc-openapi-ui:1.4.6'
// IOUtils
implementation 'commons-io:commons-io:2.8.0'
// SAAJ SOAP
compile group: 'javax.xml.soap',name: 'javax.xml.soap-api',version: '1.4.0'
compile group: 'com.sun.xml.messaging.saaj',name: 'saaj-impl',version: '1.5.2-b01'
// JAXB MARSHALLER
compile group: 'org.glassfish.jaxb',name: 'jaxb-core',version: '2.3.0.1'
compile group: 'com.sun.activation',name: 'jakarta.activation',version: '2.0.0-RC2'
compile group: 'javax.xml.bind',name: 'jaxb-api',version: '2.3.1'
compile group: 'org.glassfish.jaxb',name: 'jaxb-runtime',version: '2.3.2'
// Spring ws security
compile group: 'org.springframework.ws',name: 'spring-ws-security',version: '2.4.7.RELEASE'
// Required with org.springframework.ws.spring-ws-security FIX WRONG_DOCUMENT_ERR
compile group: 'org.apache.wss4j',name: 'wss4j-ws-security-dom',version: '2.3.0'
compile group: 'org.apache.httpcomponents',name: 'httpclient',version: '4.3.6'
// Appraisal jar
compile files('libs/appraisal.jar')
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。