cxf.jaxrs: IllegalArgumentException при использовании JAXRSServerFactoryBean - PullRequest
1 голос
/ 11 ноября 2009

Я столкнулся со следующей проблемой при настройке службы тестирования JAXRS в модульном тесте. Это код (взят из тестового класса, производного от AbstractJUnit4SpringContextTests):

    JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
    sf.setServiceBeans(applicationContext.getBean("searchXY"));
    sf.setAddress("http://localhost:9000/");
    sf.create();

    restClient = new RestTestClient();//custom class for client-side testing

    ....

    InputStream dummyRequestFileAsStream = getInputStreamForClasspathResource(
    DUMMY_REQUEST_FILE);
    LOGGER.info("Testing searchQuery ReST service access");
    int httpStatus = restClient.postXmlStream(
                    "http://localhost:9000/search/searchXY",
                    dummyRequestFileAsStream);

Я передаю тестовый файл XML в сервис. CXF будет нагло пытаться заключить xml в javax.xml.bind.JAXBElement, вызвать службу и завершится ошибкой с IllegalArgumentException (в API отражения), потому что служба, конечно, не принимает специфичный для JAX-RS элемент, а скорее элемент SearchRequest, который я определил в своем XSD ранее.

Однако, когда я вставляю следующую строку в контекст Spring, все в порядке:

<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />

Кто-нибудь еще видел это?

Ответы [ 2 ]

1 голос
/ 11 ноября 2009

Трудно понять, почему первоначальная проблема возникает без предоставления дополнительных подробностей. Вышеупомянутый импорт всегда требуется, и я никогда не пробовал тестировать, если бы он не был в весеннем контексте. Что такое трассировка исключения? Возможно, перехватчики JAXRS даже не участвуют без импорта?

ура, Сергей

0 голосов
/ 13 ноября 2009

Оказывается, я был не прав: проблема была на самом деле с XSD: у меня был элемент XSD "searchRequest", который имеет тип "SearchRequest" (sic, заглавная S), и дополнительно другой корневой элемент, который использует расширенный тип, производный от SearchRequest. Похоже, что у cxf возникают проблемы с типом, который используется как тип корневого элемента и как тип для наследования XSD. После создания дополнительного типа AbstractSearchRequest и наличия всех типов, унаследованных от этого типа, проблема исчезла.

...