2016-08-12 3 views
2

Решение проблемы управления версиями в API, который не был ранее версионную, я бегу на вопрос: У меня есть два ресурса, установленные на одной и той же URL конечной точки:Java API ресурсов приказывать

@Path("/api/foo/") 
public class FooResourceOne { 

    @GET 
    public Response getFoo() { 
     return Response.ok("Hello from One").build(); 
    } 
} 

@Path("/api/foo/") 
@Consumes("application/vnd.example.v2+json") 
public class FooResourceTwo { 

    @GET 
    public Response getFoo() { 
     return Response.ok("Hello from Two").build(); 
    } 
} 

проблема заключается в том, что если вы отправляете запрос GET с заголовком Content-Type (например, Content-Type: application/json), он отправляется на обработку FooResourceOne. И если вы укажете Content-Type: application/vnd.example.v2+json, он будет правильно соответствовать FooResourceTwo. Все хорошо и хорошо.

Однако, если вы не указали заголовок Content-Type на всех, он идет к FooResourceTwo, который не является правильным?

Не имеет знака «@Consumes» означает «принимает любые», но кажется, что «какой-либо» не включает «не указано»? Вернее, «не указано» означает, что кто-нибудь (и порядок загрузки важен)?

Есть ли способ указать FooResourceOne это ресурс, который должен реагировать, когда нет заголовка Content-Type не дается вообще?

+0

Какой REST реализации вы используете 'Resteasy/CXF/Джерси'? – 11thdimension

+0

Считаете ли вы, что добавить фильтр отдыха и добавить в контентный тип предпочтительный заголовок? –

+0

Что происходит, когда вы добавляете другой метод только с '@ Path' и без' @ Consumes'? – 11thdimension

ответ

0

Мне удалось обходное решение, которое не устраняет основной проблемы, но по крайней мере смягчает симптом. Классы Resteasy Filter и PreProcessInterceptor могут определять, когда приходит запрос, без заголовка Content-Type, но он не может ничего сделать, кроме как выбросить ошибку. Итак, мой обходной путь для FooResourceTwo сначала проверить и посмотреть, если нет набора заголовков:

@Path("/api/foo/") 
public class FooResourceOne { 

    @GET 
    public Response getFoo() { 
     return Response.ok("Hello from One").build(); 
    } 
} 

@Path("/api/foo/") 
@Consumes("application/vnd.example.v2+json") 
public class FooResourceTwo { 
    @Inject 
    private FooResourceOne oldResource; 

    @GET 
    public Response getFoo (@Context HttpServletRequest request) { 
     if (request.getHeader("content-type") == null) { 
      // No, no, Resteasy; go this way... 
      return oldResource.getFoo(); 
     } 
     return Response.ok("Hello from Two").build(); 
    } 
}