我有一个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
答案 0 :(得分:0)
看起来我正在使用does NOT support the @Provider annotation at the time being的switchyard和jboss eap版本组合。如果我设法提出自定义解决方案,我会更新答案。