Java accept标头为空或未知jax rs时的内容类型

Java accept标头为空或未知jax rs时的内容类型,java,rest,jax-rs,resteasy,Java,Rest,Jax Rs,Resteasy,当accept标头为空时,返回的默认内容是什么 下面的代码在accept标头为空时返回application/xml,该标头映射到findAll()。当accept头为空或未知时,是否有方法强制jax rs执行findAllAtom()。 我使用的是带有Jboss应用服务器和Adbera 1.1.2的restEasy版本2 @Stateless @Path("quotes") public class QuoteFacadeREST extends AbstractFacade<Quote

当accept标头为空时,返回的默认内容是什么

下面的代码在accept标头为空时返回application/xml,该标头映射到findAll()。当accept头为空或未知时,是否有方法强制jax rs执行findAllAtom()。 我使用的是带有Jboss应用服务器和Adbera 1.1.2的restEasy版本2

@Stateless
@Path("quotes")
public class QuoteFacadeREST extends AbstractFacade<Quote> {
    @PersistenceContext(unitName = "RestFullDayTraderPU")
    private EntityManager em;

    public QuoteFacadeREST() {
        super(Quote.class);
    }

    @GET
    @Override
    @Produces({"application/xml", "application/json"})
    public List<Quote> findAll() {
        return super.findAll();
    }

    @GET
    @Override
    @Produces({"application/atom+xml"})
    @GET
    public Feed findAllAtom() throws Exception {
        Factory factory = abdera.getFactory();
        Feed feed = abdera.getFactory().newFeed();
        feed.setId("tag:example.org,2007:/foo");
        feed.setTitle("Feed Title");
        feed.setSubtitle("Feed subtitle");
        feed.setUpdated(new Date());
        feed.addAuthor("My Name");
        feed.addLink("http://example.com");
        feed.addLink("http://example.com","self");
        Entry entry = feed.addEntry();
        entry.setId("tag:example.org,2007:/foo/entries/2");
        entry.setTitle("Entry title 22 44");
        entry.setUpdated(new Date());
        entry.setPublished(new Date());
        entry.setSummary("Feed Summary");
        entry.setContent("One line content");
        return feed;
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }
}
@无状态
@路径(“引号”)
公共类QuoteFacadeREST扩展了AbstractFacade{
@PersistenceContext(unitName=“RestFullDayTraderPU”)
私人实体管理者;
公开引用{
super(Quote.class);
}
@得到
@凌驾
@产生({“application/xml”、“application/json”})
公共列表findAll(){
返回super.findAll();
}
@得到
@凌驾
@产生({“应用程序/atom+xml”})
@得到
公共提要findAllAtom()引发异常{
Factory=abdera.getFactory();
Feed Feed=abdera.getFactory().newFeed();
setId(“tag:example.org,2007:/foo”);
feed.setTitle(“feed Title”);
feed.setSubtitle(“feed副标题”);
feed.setUpdated(新日期());
feed.addAuthor(“我的名字”);
feed.addLink(“http://example.com");
feed.addLink(“http://example.com“,”自我“);
Entry=feed.addEntry();
setId(“tag:example.org,2007:/foo/entries/2”);
条目。设置标题(“条目标题22 44”);
条目。设置日期(新日期());
entry.setPublished(新日期());
条目.设置摘要(“提要摘要”);
entry.setContent(“一行内容”);
回馈;
}
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
}

不带Accept头的请求意味着客户端需要任何东西,比如它指定了
*/*
。基本上,如果您有两个只在
@products
上不同的方法,并且Accept header表示“any”,那么JAX-RS框架就无法选择该方法,因此根据规范,它选择第一个方法(参见JSR-311 3.7.2)

我相信最好的解决方案是发送带有确切类型的Accept标头。
否则,您可以通过不同的URL使用不同的方法:将
@Path(“/xml”)
@Path(“/atom”)
添加到方法中。

在我的测试用例中,我使用rssOwl作为rest客户机。rssOwl正在发送一个空的接受头。这可能是很少有其他ATOM客户端的情况。处理这个问题的一种方法是使用基于url的内容协商,但我更喜欢使用header,这就是上面的问题。使用纯JAX-RS无法做到这一点。使用Apache Wink支持内容类型快捷方式。快捷方式在url中作为查询参数传递,因此调用ATOM将是一个简单的过程。我会接受你以前的建议。我将实现基于url的内容协商,至少对主要提要是这样。