Web服务错误:类xxx或其任何超级类别在本文中已知

问题描述:

我们在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 
} 
+0

我认为,loadWsControlMode()方法需要用@WebMethod注释。 – 2012-02-08 20:48:21

+0

嗯,我忘记提及的一件事,在我们的Windows本地环境中,我们没有遇到任何问题。这只适用于我们在Linux上运行的完整环境。 – 2012-02-08 21:24:44

+0

嗯,我尝试了任何数量的东西都无济于事。所以我踢了,我修改了方法返回一个List 而不是ApplicationConfigVO []。在这一点上,我认为这是一个类加载器的问题,但我不能确定。在任何一种情况下,切换到列表最终都会更容易,希望没有别的东西会咬我们。 – 2012-02-09 18:19:19

嗯,我尝试过很多事情都无济于事。所以我踢了,我修改了方法返回一个List而不是ApplicationConfigVO []。在这一点上,我认为这是一个类加载器的问题,但我不能确定。在这两种情况下,切换到列表最终更容易,希望没有别的东西会咬我们