JAX-RS REST: Направить HTTP-запрос на основе параметра MediaType - PullRequest
0 голосов
/ 31 августа 2018

У меня есть исправленный параметр MediaType +, и я пытался перенаправить HTTP-запрос на основе этого параметра.

@Path("/beer")

@GET
@Path("/all")
@Consumes("application/vnd.foo+json;type=boo/sth1")
@Produces("application/vnd.foo+json;type=koo/sth2")
Response getBeer();

@GET
@Path("{id}")
@Consumes("application/vnd.foo+json;type=woo/sth3")
@Produces("application/vnd.foo+json;type=hoo/sth4")
Response getBeer2();

Я прочитал много сообщений о версиях и о том, как использовать пользовательский MediaType:

+json - это распознаваемый MediaType как JSON ,, поэтому любой принимаемый заголовок, следующий за этим форматом, будет рассматриваться как JSON

когда я отправил запрос GET http:/localhost:8000/beer/11 (следует перейти ко второму GET методу)

с

--header 'Accept: application/vnd.foo+json;type="koo/sth2"' (неправильный тип)

Это дало мне правильный ответ (в формате JSON) с 200, и Content-Type равно hoo/sth4. В идеале он должен возвращать 406 not Acceptable, но тип ответа в любом случае соответствует требуемому формату +json, поэтому он возвращается как успешный.

В любом случае могу ли я сделать type значение обязательным для совпадения? После поиска у меня есть пара идей, но я не уверен, что это сработает:

1.Создать mediaType по умолчанию + внедрить MessageBodyWriter / Reader (на основе JacksonJsonProvider)

Но таким образом мне нужно реализовать MessageBodyWriter / Reader для каждого конкретного значения типа. def не хочет этого делать.

2. Создайте новую аннотацию, если данный тип соответствует этой аннотации, направьте запрос к этому методу, например,

    @Request("woo/sth3")
    @Response("hoo/sth4")
    Response getBeer2();

в этом случае я должен переписать RequestDispatcher / ResponseDispatcher или что-то еще?

Оба решения выглядят некрасиво, пожалуйста, поделитесь, если у вас есть хорошая идея по этому поводу.

Udpate:

Я редактирую свой вопрос, чтобы он был более конкретным, поэтому тип может быть любым, следуя формату "***/sth1", например. "boo.foo/sth1" и "keepoo/sth2".

...