无论何时我从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服务和客户端位于不同的项目中。
答案 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);
}