Исключение JAXB: класс не известен в этом контексте - PullRequest
36 голосов
/ 13 июля 2010

Когда я вызываю конкретный метод службы restful, который построен с использованием CXF , я получаю следующую ошибку, каждый знает, почему и как ее устранить?

Произошло исключение JAXB: класс com.octory.ws.dto. ProfileDto или любой другой его суперкласса известен этому контекст ...

Ниже приведены метод обслуживания и соответствующие DTO:

public class Service {
   public Response results() {
   Collection<ProfileDto> profilesDto = new ArrayList<ProfileDto>();
   ...
   SearchResultDto srd = new SearchResultDto();
   srd.setResultEntities(profilesDto); // Setting profilesDto collection as resultEntities
   srd.setResultSize(resultSize);
   return Response.ok(srd).build();
   }
}

SearchResultDto:

@XmlRootElement(name="searchResult")
public class SearchResultDto {
    private Collection resultEntities;
    private int resultSize;

    public SearchResultDto() { }

    @XmlElementWrapper(name="resultEntities")
    public Collection getResultEntities() {
        return resultEntities;
    }

    public void setResultEntities(Collection resultEntities) {
        this.resultEntities = resultEntities;
    }

    public int getResultSize() {
        return resultSize;
    }

    public void setResultSize(int resultSize) {
        this.resultSize = resultSize;
    }
}

ProfileDto:

@XmlRootElement(name="profile")
public class ProfileDto {
    ...
    ...
    public ProfileDto() { }
    ...
}

Ответы [ 6 ]

37 голосов
/ 13 июля 2010

Ваш класс ProfileDto не указан в SearchResultDto. Попробуйте добавить @XmlSeeAlso(ProfileDto.class) к SearchResultDto.

28 голосов
/ 30 марта 2012

У меня была эта ошибка, потому что я зарегистрировал неправильный класс в этой строке кода:

JAXBContext context = JAXBContext.newInstance(MyRootXmlClass.class);
3 голосов
/ 13 июля 2015

У меня была такая же проблема с весенней загрузкой.Это решилось, когда я установил пакет в маршаллер.

@Bean
public Jaxb2Marshaller marshaller() throws Exception
{
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.octory.ws.dto");
    return marshaller;
}

@Bean
public WebServiceTemplate webServiceTemplate(final Jaxb2Marshaller marshaller)   
{
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate();
    webServiceTemplate.setMarshaller(marshaller);
    webServiceTemplate.setUnmarshaller(marshaller);
    return webServiceTemplate;
}
3 голосов
/ 07 августа 2012

Это сообщение об ошибке происходит либо потому, что ваш класс ProfileDto не зарегистрирован в содержимом JAXB, либо класс, использующий его, не использует @XmlSeeAlso(ProfileDto.class) для обработки JAXB.

О вашем комментарии:

У меня сложилось впечатление, что аннотации нужны были только когда указанный класс был подклассом.

Нет, они также необходимы, когда они не объявлены в контексте JAXB или, например, когда единственный класс, имеющий статическую ссылку на него, имеет эту ссылку, помеченную @XmlTransient. Я веду учебник здесь .

2 голосов
/ 09 июля 2015

Исправлено, установив имя класса для свойства "classesToBeBound" маршаллера JAXB:

<bean id="jaxbMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="classesToBeBound">
          <list>
                <value>myclass</value>
          </list>
        </property>
</bean>
0 голосов
/ 02 сентября 2011

У меня было такое же исключение на Tomcat. Я обнаружил еще одну проблему - когда я использую wsimport над плагином maven для генерации заглушек для более чем 1 WSDL - класс ObjectFactory (ссылки на заглушки для этого класса) содержит методы ТОЛЬКО для одного wsdl , Таким образом, вы должны объединить все методы в один класс ObjectFactory (для каждого WSDL) или сгенерировать каждую заглушку wsdl в разных каталогах (будут отдельные классы ObjectFactory). Это решает проблему для меня с этим исключением .. J

...