Springboot javax.xml.ws.service Nullpointerexception при его создании - PullRequest
0 голосов
/ 28 января 2019

Я разрабатываю бэкэнд, используя 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>

1 Ответ

0 голосов
/ 30 января 2019

Не создавайте экземпляры своих сервисов, пусть Spring позаботится об этом с помощью @Autowired.Я бы не рекомендовал использовать конструктор, так как это плохая практика, просто вызывайте метод, когда вам нужно запросить ваш WSCryptDecryptSoap

@Service
public class WsCryptDecryptService {

    @Autowired
    private WSCryptDecrypt wsCryptDecrypt;

    public WSCryptDecryptSoap getWSCryptDecryptSoap() {
        return wsCryptDecrypt.getWSCryptDecryptSoap();
    }
}
...