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服务和客户端在不同的项目。
答
首先,我改变了注释@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;
}
我不知道如果它有帮助,但NullPointer在初始化一个像这样的变量时出现:List tempUserList = 。cclient.getCclientService()getOnlineUser(ID); –