我正在尝试从springboot客户端访问安全的SOAP服务,但出现此错误
StartTransaction已开始... Equifax |开始交易... Equifax |服务初始化 Equifax | 2018-09-20 07:50:38.512信息1-[nio-7070-exec-1] o.a.c.w.s.f.ReflectionServiceFactoryBean:从WSDL创建服务{{{3}}} canadav3:http://eid.equifax.com/soap/schema/canada/v3/wsdl Equifax | ServicePort发起人 Equifax | 2018-09-20 07:50:39.558信息1-[nio-7070-exec-1] o.a.c.w.s.f.ReflectionServiceFactoryBean:从WSDL创建服务{{{3}}} canadav3:https://eid.equifax.ca/uru/soap/ut/canadav3?wsdl Equifax | 2018-09-20 07:50:39.614信息1-[nio-7070-exec-1] o.a.c.w.s.f.ReflectionServiceFactoryBean:从WSDL创建服务{{{3}}} canadav3:http://eid.equifax.com/soap/schema/canada/v3/wsdl Equifax | org.apache.cxf.binding.soap.SoapFault:发现错误处理标头 Equifax |发现处理标头时发生错误
我的代码:
@ResponseBody
public ResponseEntity<Object> startTransaction(@RequestBody Identity identity) {
System.out.println("StartTransaction Started...");
InitialRequest initialRequest = new InitialRequest();
ProcessingOptions value = new ProcessingOptions();
value.setLanguage("French");
initialRequest.setIdentity(identity);
initialRequest.setProcessingOptions(value);
InitialResponse iR = new InitialResponse();
try {
System.out.println("Start transaction ...");
Canadav3 canada = new Canadav3();
System.out.println("Service initialise");
CanadaPortTypeV3 c = canada.getCanadaHttpPortV3();
System.out.println("ServicePort initiee");
URL wsdlURL = new URL("https://eid.equifax.ca/uru/soap/ut/canadav3?wsdl");
QName qname = new QName("http://eid.equifax.com/soap/schema/canada/v3/wsdl", "Canadav3");
Service service =Service.create(wsdlURL, qname);
c = (CanadaPortTypeV3)service.getPort(CanadaPortTypeV3.class);
BindingProvider bp = (BindingProvider)c;
bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "/user");
bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "mypassword");
iR = c.startTransaction(initialRequest);
System.out.println("Finish");
return ResponseEntity.status(HttpStatus.OK).body(iR);
}catch (CredentialsErrorFault c) {
System.err.println("Finish");
System.err.println("CredentialsErrorFault "+c.getLocalizedMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new Alert(c.getMessage()));
}
catch(ValidationErrorFault e) {
System.err.println("Finish");
System.err.println("ValidationErrorFault "+e.getLocalizedMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new Alert(e.getMessage()));
}
catch(Exception e) {
System.out.println(e.getCause());
System.err.println(e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(new Alert("Error unknows"));
}
}
先谢谢您
答案 0 :(得分:0)
我终于可以解决我的问题了
创建一个SOAP处理程序,以将每条传出SOAP消息的客户端身份验证信息注入SOAP头块。
import java.io.ByteArrayOutputStream;
import java.util.Set;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
private static Logger logger = Logger.getLogger(SOAPLoggingHandler.class.getName());
public boolean handleMessage(SOAPMessageContext context) {
Boolean outGoingMsg = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
SOAPMessage soapMsg = context.getMessage();
if(soapMsg != null && soapMsg.getSOAPPart() != null) {
SOAPEnvelope soapEnv;
try {
soapEnv = soapMsg.getSOAPPart().getEnvelope();
SOAPHeader soapHeader = soapEnv.getHeader();
if (soapHeader == null) {
soapHeader = soapEnv.addHeader();
}
addAuthentication(soapHeader);
} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (outGoingMsg)
System.out.println("########outgoing soap message######");
else
System.out.println("########incoming soap message############");
logSoapMessage(context);
return true;
}
public boolean handleFault(SOAPMessageContext context) {
System.out.println("########Fault soap message######");
logSoapMessage(context);
return true;
}
public void close(MessageContext context) {
}
public void logSoapMessage(SOAPMessageContext context) {
try {
SOAPMessage msg = context.getMessage();
ByteArrayOutputStream bas = new ByteArrayOutputStream();
msg.writeTo(bas);
System.out.println(bas);
}
catch (Exception e) {
System.out.println("Error while writing SOAP message to debug log " + e);
}
}
public Set<QName> getHeaders() {
return null;
}
private void addAuthentication(SOAPHeader header) {
try {
SOAPElement security =header.addChildElement("Security", "wsse", "http://docs.oasis- open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken =
security.addChildElement("UsernameToken", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement username = usernameToken.addChildElement("Username", "wsse");
username.addTextNode("/yourusername");
SOAPElement password =
usernameToken.addChildElement("Password", "wsse");
password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
password.addTextNode("yourpassword");
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后我在拨打肥皂服务时使用它 就像这里一样( 示例:SOAPLoggingHandler.java )=> https://www.juniper.net/documentation/en_US/junos-space16.1/topics/task/operational/junos-space-servicenow-tt-web-service-client-setting.html
示例– SOAPLoggingHandler.java
import java.io.ByteArrayOutputStream;
import java.util.Set;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
public class SOAPLoggingHandler implements SOAPHandler<SOAPMessageContext> {
private static Logger logger = Logger.getLogger(SOAPLoggingHandler.class.getName());
public boolean handleMessage(SOAPMessageContext context) {
Boolean outGoingMsg = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
SOAPMessage soapMsg = context.getMessage();
if(soapMsg != null && soapMsg.getSOAPPart() != null) {
SOAPEnvelope soapEnv;
try {
soapEnv = soapMsg.getSOAPPart().getEnvelope();
SOAPHeader soapHeader = soapEnv.getHeader();
if (soapHeader == null) {
soapHeader = soapEnv.addHeader();
}
addAuthentication(soapHeader);
} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (outGoingMsg)
System.out.println("########outgoing soap message######");
else
System.out.println("########incoming soap message############");
logSoapMessage(context);
return true;
}
public boolean handleFault(SOAPMessageContext context) {
System.out.println("########Fault soap message######");
logSoapMessage(context);
return true;
}
public void close(MessageContext context) {
}
public void logSoapMessage(SOAPMessageContext context) {
try {
SOAPMessage msg = context.getMessage();
ByteArrayOutputStream bas = new ByteArrayOutputStream();
msg.writeTo(bas);
System.out.println(bas);
}
catch (Exception e) {
System.out.println("Error while writing SOAP message to debug log " + e);
}
}
public Set<QName> getHeaders() {
return null;
}
private void addAuthentication(SOAPHeader header) {
try {
SOAPElement security =
header.addChildElement("Security", "wsse", "http://docs.oasis- open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement usernameToken =
security.addChildElement("UsernameToken", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement username =
usernameToken.addChildElement("Username", "wsse");
username.addTextNode("***");
SOAPElement password =
usernameToken.addChildElement("Password", "wsse");
password.setAttribute("Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
password.addTextNode("***");
} catch (Exception e) {
e.printStackTrace();
}
}
}