在单元测试中设置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特定的元素,而是我之前在XSD中定义的SearchRequest元素。
但是,当我在弹簧上下文中插入以下行时,一切都很好:
<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />
其他人见过这个吗?
答案 0 :(得分:1)
如果没有提供更多详细信息,很难理解为什么原始问题会发生。上面的导入总是需要的,我从来没有尝试过测试,如果没有它在春天的背景下。什么是异常跟踪?如果没有导入,JAXRS拦截器甚至可能不参与?
欢呼,谢尔盖答案 1 :(得分:0)
事实证明我错了:问题实际上是XSD:我有一个XSD元素“searchRequest”,类型为“SearchRequest”(sic,大写S),另外还有一个使用扩展的根元素类型,源自SearchRequest。似乎cxf遇到了一个类型的问题,该类型既用作根元素的类型,也用作XSD继承的类型。在创建了另一个类型AbstractSearchRequest并使所有类型继承该类型后,问题就消失了。