java - 基于接受参数的 REST 服务响应

标签 java rest jersey soapui java-ws

我希望创建一个与 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/

相关文章:

python - Python pickle 的首选(或最常见)文件扩展名

validation - JAX RS 泽西模式验证

java - 无法在 GlassFish 中使用 Jersey 启用 REST(引发与 JPA 相关的异常)

java - 按顺序读取参数列表/1;2;3;4;5

java - Tomcat 8.0 为 Jersey 休息服务提供 404

java - 在 Java 中添加到列表中的系列

Java 8 扩展函数接口(interface)并组合它们

java - 查询 mongoRepository 列表

java - 使用Java jersey和Spring Security进行的Pdf下载在初始化 postman 的请求时给出错误

多个泛型类型的 Java 编译器错误