Java accept标头为空或未知jax rs时的内容类型
当accept标头为空时,返回的默认内容是什么 下面的代码在accept标头为空时返回application/xml,该标头映射到findAll()。当accept头为空或未知时,是否有方法强制jax rs执行findAllAtom()。 我使用的是带有Jboss应用服务器和Adbera 1.1.2的restEasy版本2Java 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
@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的内容协商,至少对主要提要是这样。