我希望创建一个与 XML 以及 JSON 响应兼容的 REST 服务。两者的 URI 相似。我需要根据接受 header 提供响应。
这可以通过单个 URI 实现吗?如果可能的话,如何设置@Produces?
最佳答案
读取@Produces
的javadoc:
Defines the media type(s) that the methods of a resource class or {@link javax.ws.rs.ext.MessageBodyWriter} can produce. * If not specified then a container will assume that any type can be produced.
这意味着此注释只会减少支持的媒体类型的数量。否则,选择将自动完成。
接口(interface)MessageBodyWriter
有很多针对不同媒体类型的实现。具体实现选择MessageBodyFactory
:
public <T> MediaType getMessageBodyWriterMediaType(Class<T> c, Type t,
Annotation[] as, List<MediaType> acceptableMediaTypes) {
for (MediaType acceptable : acceptableMediaTypes) {
for (MessageBodyWriterPair mbwp : customWriterListProviders) {
for (MediaType mt : mbwp.types) {
if (mt.isCompatible(acceptable) &&
mbwp.mbw.isWriteable(c, t, as, acceptable)) {
return MediaTypes.mostSpecific(mt, acceptable);
}
}
}
......................
正如我们所见,选择了支持第一个 acceptableMediaTypes
的第一个提供程序。尽管恕我直言,名称 acceptableMediaTypes
是可以 self 解释的,但我继续我的发现并找到了唯一调用此方法的地方:
contentType = getMessageBodyWorkers().getMessageBodyWriterMediaType(
entity.getClass(),
entityType,
annotations,
request.getAcceptableMediaTypes());
其中request
的类型是ContainerRequest
。
这是getAcceptableMediaTypes()
的代码
public List<MediaType> getAcceptableMediaTypes() {
if (accept == null || headersModCount != headers.getModCount())
accept = new ArrayList<MediaType>(HttpHelper.getAccept(this));
return accept;
}
正如我们所看到的,媒体类型列表填充了 HttpHelper.getAccept(this)
的结果:
最终字符串接受 = request.getHeaderValue(HttpHeaders.ACCEPT);
底线:是的,媒体类型会根据 HTTP header Accept
自动选择,除非硬编码注释 @Produces
对此进行限制。
关于java - 基于接受参数的 REST 服务响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18712218/