我正在使用springboot开发后端。我需要在springboot应用程序中实现一个soap客户端,但是我遇到的一个问题是我不明白为什么会引发它以及如何引发它。
@WebServiceClient(name = "WSCryptDecrypt", targetNamespace = "example", wsdlLocation = "Example")
public class WSCryptDecrypt extends Service {
private final static QName WSCRYPTDECRYPT_QNAME = new QName("Example", "WSCryptDecrypt");
public WSCryptDecrypt(URL wsdlLocation) {
super(wsdlLocation, WSCRYPTDECRYPT_QNAME);
}
}
我像这样实例化此类:
WSCryptDecrypt wsCryptDecrypt = new WSCryptDecrypt(new URL("<WSDL-URL>"));
但是我得到这个错误:
Caused by: java.lang.NullPointerException: null
at javax.xml.ws.Service.<init>(Service.java:112) ~[jaxws-api-2.3.1.jar:na]
at com.mybackend.model.WSCryptDecrypt.<init>(WSCryptDecrypt.java:43) ~[classes/:na]
我不知道为什么以及如何引发此错误。我作为参数传递的wsdl的网址肯定是正确的。我在springboot环境之外尝试了代码,并且效果很好。相反,Springboot抱怨抛出此错误。
更新:
正如@Laurens建议的那样,我尝试了这种方法:
用@Component注释WSCryptDecrypt类,然后将其注释为WsCryptDecryptService类
@Autowired
WSCryptDecrypt wsCryptDecrypt;
另外,我用@Service注释了WsCryptDecryptService类。
更新2:
实例化javax.xml.ws.service类时,它将调用this.getClass()。
也许这是错误,Spring尚未创建Service对象,因此为null。但我不知道该如何解决。
更新3:
新的完全更新的代码:
@Component
@WebServiceClient(name = "WSCryptDecrypt", targetNamespace = "example", wsdlLocation = "Example")
public class WSCryptDecrypt extends Service {
private final static QName WSCRYPTDECRYPT_QNAME = new QName("Example", "WSCryptDecrypt");
public WSCryptDecrypt(URL wsdlLocation) {
// Here it throws the error
super(wsdlLocation, WSCRYPTDECRYPT_QNAME);
}
}
服务等级
@Service
public class WsCryptDecryptService {
//this is the soap service
private WSCryptDecryptSoap wsCryptDecryptSoap;
@Autowired
WSCryptDecrypt wsCryptDecrypt;
/**
* Creates the service pointing to TEST Environment.
* @throws MalformedURLException
*/
public WsCryptDecryptService() {
wsCryptDecryptSoap = wsCryptDecrypt.getWSCryptDecryptSoap();
}
}
更新4
我认为这可能是依赖的问题。这些就是我在pom中为javax.xml.ws放入的依赖项(它们超出了所需的范围,只是因为我想检查是否已加载所有可能的库)
<dependency>
<groupId>javax.jws</groupId>
<artifactId>javax.jws-api</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.jws</groupId>
<artifactId>jsr181</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>javax.jws</groupId>
<artifactId>com.springsource.javax.jws</artifactId>
</dependency>
<dependency>
<groupId>javax.jws.jsr181-api</groupId>
<artifactId>jsr181-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.jaxws-api-2.0</artifactId>
<version>4.0-m1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>rt</artifactId>
<version>2.3.1</version>
</dependency>
最佳答案
不要实例化您的服务,让Spring使用@Autowired处理它。我不建议使用构造函数,因为这是一种不好的做法,只需在需要请求WSCryptDecryptSoap时调用该方法
@Service
public class WsCryptDecryptService {
@Autowired
private WSCryptDecrypt wsCryptDecrypt;
public WSCryptDecryptSoap getWSCryptDecryptSoap() {
return wsCryptDecrypt.getWSCryptDecryptSoap();
}
}
关于java - 实例化Springboot javax.xml.ws.service NullpointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54397280/