Я разрабатываю бэкэнд, используя springboot.Мне нужно реализовать SOAP-клиент в моем приложении Springboot, но я столкнулся с проблемой, которую я не могу понять, почему она возникает и как.
@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]
Я не понимаю, почему и как эта ошибка выдается.URL-адрес wsdl, который я передаю в качестве параметра, точно верен.Я пробовал код за пределами среды Springboot, и он работает хорошо.Вместо этого Springboot жалуется, выдавая эту ошибку.
ОБНОВЛЕНИЕ:
Как предложил @Laurens, я попробовал этот подход:
Annotate WSCryptDecrypt class с @ Component , а затем в класс WsCryptDecryptService. Мне это нравится
@Autowired
WSCryptDecrypt wsCryptDecrypt;
Кроме того, я аннотировал класс WsCryptDecryptService с помощью @ Service
ОБНОВЛЕНИЕ 2:
Класс javax.xml.ws.service при создании экземпляра вызывает this.getClass ().Возможно, это ошибка, Spring еще не создал объект Service, поэтому this равно нулю.Но я не знаю, как мне это исправить.
ОБНОВЛЕНИЕ 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>