2014-10-27 5 views
0

Мы должны поддерживать JBoss AS 7.1.3 и Wildfly в нашем проекте. Для обеспечения этой возможности у нас есть два профиля maven с различными зависимостями и версиями, которые предоставляются в AS. Все работает нормально, но в последнее время мы столкнулись с проблемой в JBoss, связанной с Resteasy.Resteasy - поддержка JBoss AS 7 и Wildfly

Наши услуги 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», а его подпись preProcess изменилась с момента Resteasy 2.3.3.

Подпись PreProcessInterceptor.preProcess для 2.3.3:

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. У нас есть модуль interop для предоставления классов, которые отличаются на этих платформах, например. имеют разные имена пакетов.

+0

К сожалению, обновление Resteasy не является вариантом, потому что у нас нет прямого доступа к системам заказчика, и приложение не является единственным, кто использует Resteasy. – dds

ответ

0

Наконец я придумал следующее решение:

  1. создать свой собственный интерфейс 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; 
    

    }

  2. Создать ResourceMethod класс в Interop для Wildfly

  3. Создать ResourceMethodInvoker класс в Interop для JBoss AS 7.1.3
  4. Изменить MyInterceptor для реализации n РЭБ интерфейс MyPreProcessInterceptor
  5. Реализовать необходимую логику только в способе Restesy 2.3.3, и только return null; для 3.0.8

Так что теперь он компилирует и работает на обеих платформах в настоящее время.

Смежные вопросы