Web Sphere 7.0.0.19サーバーでホストされているJAX-WSサービスがあります。このサービスは@WebServiceアノテーションを使用して実装されています。 WSDLを尋ねるサービスを打つと、XMLが返されます。しかし、我々は、Webサービスメソッドを呼び出した場合、それは次のエラーを返します。Webサービス・エラー:クラスxxxもそのスーパー・クラスもこのコンテキストで認識されていません
javax.xml.ws.soap.SOAPFaultException: javax.xml.bind.MarshalException
- with linked exception:
[javax.xml.bind.JAXBException: class com.penske.newreuse.vo.ApplicationConfigVO nor any of its super class is known to this context.]
at com.sun.xml.internal.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:171)
at com.sun.xml.internal.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:94)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:240)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:210)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:103)
たちのログを見ると、私たちのコードが正常に呼び出され、私たちは、予想されるデータを返しています。ただし、データがマーシャリングされて、障害が発生したことがクライアントに返されるのはそのときです。
ApplicationConfigVOクラスは別のjarファイルにありました。私たちは試して取り出して、ソースを直接サービスに含めました。変更はありません。
@ XmlSeeAlso(ApplicationConfigVO.class)をApplicationConfigVOオブジェクトに追加しましたが、変更はありません。
これは、Webサービスのコードです:
@WebService(serviceName="WebServiceConfigService")
public class WebServiceConfig {
private static Logger log = Logger.getLogger(WebServiceConfig.class);
public ApplicationConfigVO[] loadWsControlMode(int applicationId,String appsId) throws Exception {
log.info("loadWsControlMode WebService Invoked Application ID :"+ appsId);
List returnList = null;
ApplicationConfigVO[] resultArray = null;
try {
ApplicationConfigVO modelObj = new ApplicationConfigVO();
modelObj.setApplicationId(applicationId);
IApplicationConfigDAO daoObj = DAOFactory.getApplicationConfigDAO();
returnList = daoObj.loadWsControlMode(modelObj);
if(null != returnList && returnList.size()>0){
resultArray = new ApplicationConfigVO[returnList.size()];
//Populate the ApplicationConfigVO array from arraylist
modelObj = new ApplicationConfigVO();
for(int i=0;i<returnList.size();i++){
modelObj = (ApplicationConfigVO)returnList.get(i);
resultArray[i] = modelObj;
}//End of for loop
}
} catch (Exception e) {
log.error(DAWebServiceUtil.stackTraceToString(e));
throw e;
}
return resultArray;
}
これはApplicationConfigVOクラスです:
public class ApplicationConfigVO implements Serializable{
private int applicationId;
private String webServiceControlMode = null;
private int webServiceId;
private String webServiceName = null;
private int webServiceMethodId;
private int opModeId;
private String webServiceMethodDesc = null;
private int dataBaseTypeId;
private String dataBaseTypeDesc = null;
... // various getters and setters following java bean rules
}
loadWsControlMode()メソッドに@WebMethodアノテーションを付ける必要があります。 –
私の言うことは忘れていたことですが、Windows環境では問題は発生しません。これは、Linux上で実行されている私たちの完全な環境でのみ発生します。 –
まあ、私は無駄なものをいくつでも試しました。だから、私はパントして、ApplicationConfigVO []の代わりにListを返すようにメソッドを変更しました。この時点ではクラスローダーの問題だと思いますが、私は確信が持てません。どちらの場合でも、リストへの切り替えは最終的には簡単でした。うまくいけば何も私たちを噛んでくれません。 –