调用Web方法的Java Web服务客户端NullPointerException

时间:2016-09-28 13:14:24

标签: java web-services webservice-client

无论何时我从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);
    }

我的网络服务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服务和客户端位于不同的项目中。

1 个答案:

答案 0 :(得分:0)

首先,我从我的&#34; CClientServiceImpl.class&#34;更改了注释@WebService。到@WebService(endpointInterface="webservice.CClientService"),因为我用System.out.println(ws.get...().size());意识到我收到了错误信息&#34;未知端口&#34;,在我更改了注释后,#34;未知端口&#34;错误已经解决。

问题是,我想要返回一个&#34; ObservableList&#34; ...我将其更改为&#34; List&#34; (在&#34; CClientServiceImpl.class&#34;和&#34; BenutzerService.class&#34;)问题解决了...我检查了所有内容,但没有尝试如果我得到正常情况会发生什么{{1 }}

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

java.util.List

和这样的实现:

public List<Benutzer> getOnlineUser(int id);

最后我的服务改为:

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