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

问题描述:

无论何时,我从Web服务调用Method时,客户端都会收到NullPointerException。Java Web服务客户端调用Web方法时的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 

我的web服务:

@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); 
} 

}

我BenutzerService:

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服务和客户端在不同的项目。

+0

我不知道如果它有帮助,但NullPointer在初始化一个像这样的变量时出现:List tempUserList = 。cclient.getCclientService()getOnlineUser(ID); –

首先,我改变了注释@WebService从我的“CClientServiceImpl.class”到@WebService(endpointInterface="webservice.CClientService"),因为我有System.out.println(ws.get...().size());我得到的错误消息“未知端口”实现后,我改变了注释“未知端口”错误已解决。

问题是,我想返回一个“ObservableList”...我将它更改为“List”(在“CClientServiceImpl.class”和“BenutzerService.class”)并且问题解决了... I检查了一切,但不要试图发生什么,如果我得到一个正常的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; 
}