Java 基于accept参数的REST服务响应

Java 基于accept参数的REST服务响应,java,rest,jersey,soapui,java-ws,Java,Rest,Jersey,Soapui,Java Ws,我希望创建一个兼容XML和JSON响应的REST服务。两者的URI相似。我需要根据accept标头提供响应 使用单个URI是否可以实现这一点?如果可能,如何设置@products?@products({“application/xml”、“application/json”}) 对于JAX-RS实现 很久以前我就使用过它,但我记得——并且可能仍然适用于某些实现——您需要向应用程序添加定制的MediaConfig。但是它绝对是为JEE6/7内置的 在那个时候,我自定义了请求uri中的文件扩展名。。

我希望创建一个兼容XML和JSON响应的REST服务。两者的URI相似。我需要根据accept标头提供响应

使用单个URI是否可以实现这一点?如果可能,如何设置@products?

@products({“application/xml”、“application/json”})

对于JAX-RS实现

很久以前我就使用过它,但我记得——并且可能仍然适用于某些实现——您需要向应用程序添加定制的MediaConfig。但是它绝对是为JEE6/7内置的

在那个时候,我自定义了请求uri中的文件扩展名。。。也许头球一直有效

编辑:
刚搜索过的,可能不是MediaConfig,我会在找到/记住它的时候回来,如果它仍然需要的话。

阅读
@的javadoc会产生

定义资源类或类的方法所使用的媒体类型 {@link javax.ws.rs.ext.MessageBodyWriter}可以生成。*如果未指定,则容器将假定可以生成任何类型

这意味着此注释只会减少支持的媒体类型的数量。否则,选择将自动完成

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);
                }
            }
        }
        ......................
其中,
request
的类型是
ContainerRequest

下面是
getAcceptableMediaTypes()的代码

public List getAcceptableMediaTypes(){
if(accept==null | | headersModCount!=headers.getModCount())
accept=newarraylist(HttpHelper.getAccept(this));
退货接受;
}
正如我们所看到的,介质类型列表中填充了
HttpHelper.getAccept(this)

final String accept=request.getHeaderValue(HttpHeaders.accept)

底线:是的,根据HTTP头
接受
自动选择媒体类型,除非硬编码注释
@产生
限制这一点

        contentType = getMessageBodyWorkers().getMessageBodyWriterMediaType(
                    entity.getClass(),
                    entityType,
                    annotations,
                    request.getAcceptableMediaTypes());
public List<MediaType> getAcceptableMediaTypes() {
    if (accept == null || headersModCount != headers.getModCount())
        accept = new ArrayList<MediaType>(HttpHelper.getAccept(this));

    return accept;
}