cxf.jaxrs:使用JAXRSServerFactoryBean时出现IllegalArgumentException

时间:2009-11-11 14:55:37

标签: java cxf jax-rs

在单元测试中设置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" />

其他人见过这个吗?

2 个答案:

答案 0 :(得分:1)

如果没有提供更多详细信息,很难理解为什么原始问题会发生。上面的导入总是需要的,我从来没有尝试过测试,如果没有它在春天的背景下。什么是异常跟踪?如果没有导入,JAXRS拦截器甚至可能不参与?

欢呼,谢尔盖

答案 1 :(得分:0)

事实证明我错了:问题实际上是XSD:我有一个XSD元素“searchRequest”,类型为“SearchRequest”(sic,大写S),另外还有一个使用扩展的根元素类型,源自SearchRequest。似乎cxf遇到了一个类型的问题,该类型既用作根元素的类型,也用作XSD继承的类型。在创建了另一个类型AbstractSearchRequest并使所有类型继承该类型后,问题就消失了。