无法加载自定义MessageBodyReader

时间:2016-12-23 17:42:29

标签: java rest jboss

我有一个REST端点接口,其内容如下:

@POST
@Path("/")
@Consumes(MediaType.TEXT_PLAIN)
@Produces({ MediaType.APPLICATION_XML })
MyResponse performAction(MyRequest request);

我应该使用自定义MessageBodyReader创建MyRequest类,我试图按如下方式创建:

@Provider
@Consumes(MediaType.TEXT_PLAIN)
public class MyRequestBodyReader implements MessageBodyReader<MyRequest > {

    @Override
    public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations,
        final MediaType mediaType) {
        System.out.println("### we are gonna in the equality");
        return type == MyRequest.class;
    }

    @Override
    public MyRequest readFrom(final Class<MyRequest> type, final Type genericType,
        final Annotation[] annotations, final MediaType mediaType,
        final MultivaluedMap<String, String> httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException {
        System.out.println("unmarshalling");
        return JAXB.unmarshal(entityStream, MyRequest.class);
    }

}

但是,当我将我的应用程序部署到Jboss时,我收到一条错误消息:

Could not find message body reader for type: com.some.MyRequest of content type: text/plain

为了尝试查看依赖关系是否是一个问题,仅仅是为了清酒,我已经添加了几乎所有对我的pom的resteasy引用,如下所示:

 <dependency>
        <groupId>org.jboss.spec.javax.ws.rs</groupId>
        <artifactId>jboss-jaxrs-api_1.1_spec</artifactId>
    </dependency>
    <dependency>
        <groupId>org.switchyard.components</groupId>
        <artifactId>switchyard-component-resteasy</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-cdi</artifactId>
        <version>2.3.6.Final</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>2.3.6.Final</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxb-provider</artifactId>
        <version>2.3.6.Final</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>2.3.6.Final</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jsapi</artifactId>
        <version>2.3.6.Final</version>
        <scope>provided</scope>
    </dependency>

所有这些依赖项都在我的jboss eap模块文件夹中。我是否遗漏了依赖部分或配置中的内容以便我的MessageBodyReader被采用?

查看文档here,声明:

  

Resteasy ServletContextLoader将自动扫描您的WEB-INF / lib和classes目录以查找使用@Provider注释的类,或者您可以在web.xml中手动配置它们。请参阅安装/配置

我已经检查了生成的war文件,并且我能够确认WEB-INF目录包含一个lib文件夹,并且我的jars(其中一个包含提供者)实际存在。但是,似乎自动扫描没有把它拿起来。

我尝试了mkyong的解决方案,但这对我没有解决问题。

我使用documentation中的方法来尝试正确调用邮件正文编写器。

我尝试制作一个包含以下内容的web.xml文件,但没有成功。

<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <context-param>
        <param-name>resteasy.resources</param-name>
        <param-value>com.some.MyRequestBodyReader</param-value>
    </context-param>
</web-app>

我也尝试过解析stackoverflow,但似乎与编写器相关的大多数问题都是缺少自定义编写器的库,类似于one

1 个答案:

答案 0 :(得分:0)

看起来我正在使用does NOT support the @Provider annotation at the time being的switchyard和jboss eap版本组合。如果我设法提出自定义解决方案,我会更新答案。