簡體   English   中英

調用Web方法的Java Web服務客戶端NullPointerException

[英]Java Web Service Client NullPointerException on calling a Web Method

無論何時我從Web服務調用Method,客戶端都會獲得NullPointerException。

這些是我從測試中得到的結果:

  • 工具“SoapUI”顯示WebService正常工作並返回預期值

  • 沒有變量為null

  • WebService的返回值似乎無法到達客戶端

  • 客戶端成功連接到WebService

例外:

javafx.fxml.LoadException: 
... Not Important ...
Caused by: java.lang.NullPointerException
at com.sun.xml.internal.bind.v2.ClassFactory.create0(Unknown Source)
at com.sun.xml.internal.bind.v2.ClassFactory.create(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.startPacking(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.startPacking(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.reflect.NullSafeAccessor.get(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.reflect.Accessor.getUnadapted(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$5.get(Unknown Source)
at com.sun.xml.internal.ws.db.glassfish.RawAccessorWrapper.get(Unknown Source)
at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit$PartBuilder.readResponse(Unknown Source)
at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit.readResponse(Unknown Source)
at com.sun.xml.internal.ws.client.sei.StubHandler.readResponse(Unknown Source)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(Unknown Source)
at com.sun.xml.internal.ws.db.DatabindingImpl.deserializeResponse(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(Unknown Source)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(Unknown Source)
at com.sun.proxy.$Proxy40.getOnlineUser(Unknown Source)
at application.Controller.init(Controller.java:141)
at application.Controller.initialize(Controller.java:74)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
... 17 more

我的WebService:

    @WebService
    @SOAPBinding(style = javax.jws.soap.SOAPBinding.Style.DOCUMENT, use=javax.jws.soap.SOAPBinding.Use.LITERAL, parameterStyle=javax.jws.soap.SOAPBinding.ParameterStyle.WRAPPED)
    public interface CClientService {
      public ObservableList<Benutzer> getOnlineUser(int id);
    }

我的Web服務Impl:

@WebService
public class CClientServiceImpl implements CClientService {
private BenutzerService benutzerService;
private Notification notification;

    @Override
    public ObservableList<Benutzer> getOnlineUser(int id) {
        return benutzerService.getAllOnlineBenutzerWithoutMe(id);
    }
}

我的通知:

public class Notification extends Observable {

@Override
public synchronized void addObserver(Observer o) {
    notifyTheObservers(o);
    super.addObserver(o);
}

@Override
public synchronized void deleteObserver(Observer o) {
    super.deleteObserver(o);
    notifyTheObservers(o);
}

public void notifyTheObservers(Object arg){
    setChanged();
    super.notifyObservers(arg);
}

}

我的Benutzer服務:

public class BenutzerService extends Repository<Benutzer> {

    public ObservableList<Benutzer> getAllOnlineBenutzerWithoutMe(int id){
       ObservableList<Benutzer> listeAllerBenutzer = FXCollections.observableArrayList();
       listeAllerBenutzer.setAll(em.createNamedQuery("Benutzer.findAllOnlineWithoutMe",Benutzer.class).setParameter("b_id", id).getResultList());
       return listeAllerBenutzer;
    }
}

我的存儲庫:

public abstract class Repository<T> {
   protected EntityManagerFactory emf = Persistence.createEntityManagerFactory("unitname");
   protected EntityManager em = emf.createEntityManager();

   abstract public void create(T object);
   abstract public void update(T object);
   abstract public void delete(T object);
   abstract public T findById(int id);
   abstract public ObservableList<T> getAll();
}

我的客戶:

public class CClient implements Observer {
private Client client;
private final String host = "localhost";
private final String port = "8080";
private final String path = "MyCoolPath?wsdl";
private CClientService cclientService;
public CClient(){
    client = new Client();
    this.cclientService = getService();
}

public Client getClient() {
    return client;
}

@Override
public void update(Observable o, Object arg) {
    switch(arg.getClass().getSimpleName()){
        case "String":
            System.out.println("Got it, my String.");
            break;
        default:
            System.out.println(arg.getClass().getSimpleName()+"<<<<<<<<");
            break;
    }
}

private CClientService getService(){
    URL urlAdresse = null;
    try {
        urlAdresse = new URL("http://"+ host + ":"+ port + "/" + path);
    } catch (MalformedURLException e) {
        System.out.println("No Connection!");
        e.printStackTrace();
    }

    QName qnameService = new QName("http://webservice/",
            "CClientServiceImplService");
    QName qnamePort = new QName("http://webservice/",
            "CClientServiceImplPort");

    Service service = Service.create(urlAdresse,qnameService);
    CClientService ws = service.getPort(qnamePort,CClientService.class);

    return ws;
}

public CClientService getCclientService() {
    return this.cclientService;
}
}

Web服務和客戶端位於不同的項目中。

首先,我將Annotation @WebService從我的“CClientServiceImpl.class”更改為@WebService(endpointInterface="webservice.CClientService") ,因為我用System.out.println(ws.get...().size()); 我收到錯誤消息“未知端口”,在我更改注釋后,“未知端口”錯誤已解決。

問題是,我想返回一個“ObservableList”......我將它改為“List”(在“CClientServiceImpl.class”和“BenutzerService.class”),問題解決了......我檢查了一切,但是不要嘗試如果我得到一個普通的java.util.List會發生什么。

所以我的WebService接口方法如下所示:

public List<Benutzer> getOnlineUser(int id);

和這樣的實現:

@Override
public List<Benutzer> getOnlineUser(int id) {
    return benutzerService.getAllOnlineBenutzerWithoutMe(id);
}

最后我的服務改為:

public List<Benutzer> getAllOnlineBenutzerWithoutMe(int id){
    List<Benutzer> listeAllerBenutzer = FXCollections.observableArrayList();
    listeAllerBenutzer = (em.createNamedQuery("Benutzer.findAllOnlineWithoutMe",Benutzer.class).setParameter("b_id", id).getResultList());
    return listeAllerBenutzer;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM