Ошибка веб-службы: класс xxx, ни один из его суперкласса не известен в этом контексте - PullRequest
2 голосов
/ 08 февраля 2012

У нас есть служба JAX-WS, размещенная на сервере Web Sphere 7.0.0.19. Сервис реализован с использованием аннотаций @WebService. Если мы нажмем сервис, чтобы запросить WSDL, мы успешно вернем нам XML. Однако если мы вызываем метод веб-службы, он возвращает следующую ошибку:

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, но все еще без изменений.


Это код веб-службы:

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

1 Ответ

0 голосов
/ 09 февраля 2012

Ну, я попробовал любое количество вещей безрезультатно. Так что я понял, что изменил метод, чтобы он возвращал список вместо ApplicationConfigVO []. На данный момент я думаю, что это проблема загрузчика классов, но я не могу быть уверен. В любом случае переключение на список в конечном итоге стало проще, и, надеюсь, ничто иное не укусит нас.

...