选择MessageBodyWriter

时间:2019-07-07 15:23:17

标签: jax-rs resteasy

我的应用程序有2个MessageBodyWriters:

  • MBW1产生某种东西/混凝土; qs = 0.6
  • MBW2产生* / *; qs = 0.01

RestEasy正确将MBW1用于以下接受标头值:

  1. 某事/不受支持,* / *
  2. 某物/不受支持,* / *; q = 1
  3. 某事/不受支持; q = 0.9,* / *; q = .9'
  4. * / *
  5. * / *; q = 0.1

但是,它选择MBW2作为以下accept-header值:

  1. 某物/不受支持,* / *; q = 0.99

我希望仅当没有其他MBW可以提供客户端可接受的功能时才选择MBW2。但是,即使MBW1产生的具体类型确实可以被客户接受,似乎还是选择了MBW2。我没有看到RestEsays返回带有4和5的值/具体值的理由,但是当客户端添加其他不受支持的格式时(6)却没有。这是JAX-RS规范还是RestEasy的问题?

1 个答案:

答案 0 :(得分:0)

按照JAX-RS规范的第3.8节,并假设JAX-RS资源方法和类没有@Produces批注,并且两个MessageBodyWriters支持我们在设置的步骤2中返回的实体对象的类

P = {"something/concrete; qs=0.6", "*/*; qs=0.01"}

这是我们设置的第4步

A = {"something/unsupported","*/*; q=0.99"}

通过在步骤5中组合P和A中的值,我们进行设置

M = {"something/unsupported; qs=0.01", "something/concrete; q=0.99; qs=0.6", "*/*; q=0.99; qs=0.01"}

在步骤7 M中,假定/不支持的事物的隐式q值为1,则排序如下:

M = {"something/unsupported; q=1; qs=0.01", "something/concrete; q=0.99; qs=0.6", "*/*; q=0.99; qs=0.01"}

在步骤8 something/unsupported中,选择响应的媒体类型,然后选择MBW2。

因此,这似乎是JAX-RS规范的问题,因为q并不用于表示质量,而当q值相同时,它只是第三级排序因子。

这里提议将其更改为JAX-RS,以实现更灵活的内容协商:https://github.com/factsmission/jax-rs-spec/