接受标头为空或未知的jax-rs时的内容类型

时间:2011-04-13 10:14:54

标签: java rest jax-rs resteasy

accept header为空时返回的默认内容是什么?

当accept header为空并映射到findAll()时,下面的代码返回application / xml。当accept header为空或未知时,有没有办法强制jax-rs执行findAllAtom()。 我正在使用带有Jboss Application服务器和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;
    }
}

1 个答案:

答案 0 :(得分:3)

没有Accept标头的请求意味着客户端需要任何内容​​,例如它是否指定了*/*。基本上如果你有两个方法只有@Produces不同而Accept头的意思是“任意”,那么JAX-RS框架就无法选择方法,所以根据规范选择第一个方法(见JSR-311 3.7.2)

我相信最好的解决方案是发送具有确切类型的Accept标头。 否则,您可以通过不同的网址区分不同的方法:向方法添加@Path("/xml")@Path("/atom")