我们必须在我们的项目中支持JBoss AS 7.1.3和Wildfly。 为了提供这种可能性,我们有两个具有不同依赖关系和版本的maven配置文件,它们在AS中提供。 一切正常,但最近我们遇到了JBoss的问题,与Resteasy有关。
我们的REST服务使用@Consumes(MediaType.APPLICATION_JSON)
注释。
但是如果我们例如在没有设置PUT
标头字段的情况下发出了Content-Type
个请求,我们得到了404
状态的响应。
我们希望使用415 Unsupported Media Type
进行响应,因此我们编写了拦截器以检查MediaType
并抛出UnsupportedMediaTypeException
(如果未设置)。
在Wildfly中,这个问题已得到修复,因此我们不需要这个拦截器。
主要问题是Resteasy主要版本在Wildfly中有所不同 - 3.0.8.Final(在JBoss 7.1.3中它是2.3.3.Final)并且存在一些不兼容的变化。
E.g。我们的拦截器实现了org.jboss.resteasy.spi.interception.PreProcessInterceptor
,它在Resteasy 3.0.8中被标记为Deprecated,并且它的preProcess
方法的签名自Resteasy 2.3.3以来已经改变。
2.3.3的PreProcessInterceptor.preProcess
签名:
ServerResponse preProcess(HttpRequest request, ResourceMethod method) throws Failure, WebApplicationException;
和3.0.8:
ServerResponse preProcess(HttpRequest request, ResourceMethodInvoker method) throws Failure, WebApplicationException;
所以我们的拦截器甚至不会为Wildfly编译。
问题是:如何解决这个问题,使代码可以编译为JBoss AS 7.1.3 / Wildfly并避免在Wildfly中使用这个拦截器?
通过注释注册的拦截器:
@Provider
@ServerInterceptor
public class MyInterceptor implements PreProcessInterceptor
P.S。我们有互操作模块来提供这些平台中不同的类,例如有不同的包名。
答案 0 :(得分:0)
最后,我想出了以下解决方案:
创建我自己的界面
public interface MyPreProcessInterceptor extends PreProcessInterceptor
{
//method signature for Restesy 2.3.3
ServerResponse preProcess(HttpRequest request, ResourceMethod method)
throws Failure, WebApplicationException;
//method signature for Restesy 3.0.8
ServerResponse preProcess(HttpRequest request, ResourceMethodInvoker method)
throws Failure, WebApplicationException;
//method signature for Restesy 3.0.8
ServerResponse preProcess(HttpRequest request, ResourceMethodInvoker method)
throws Failure, WebApplicationException;
在Wildfly
}
课程
ResourceMethod
类ResourceMethodInvoker
以实施新界面MyInterceptor
MyPreProcessInterceptor
for 3.0.8 现在它现在可以编译并适用于两个平台。