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

发布于 2024-11-01 04:06:17 字数 1552 浏览 3 评论 0 原文

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

当接受标头为空时,以下代码返回 application/xml,映射到 findAll()。当接受头为空或未知时,有没有办法强制 jax-rs 执行 findAllAtom() 。 我正在使用restEasy版本2与Jboss应用程序服务器和Adbera 1.1.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;
    }
}

What is the default content returned when accept header is empty?

The below code returns application/xml when accept header is empty which maps to findAll(). Is there a way to force jax-rs to execute findAllAtom() when accept header is empty or unknown.
I am using restEasy version 2 with Jboss Application server and Adbera 1.1.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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜点 2024-11-08 04:06:17

没有 Accept 标头的请求意味着客户端期望任何内容,例如它是否指定了 */*。基本上,如果您有两个方法仅在 @Produces 上有所不同,并且 Accept 标头表示“任何”,则 JAX-RS 框架无法选择该方法,因此根据规范,它选择第一个(参见 JSR-311 3.7.2)

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

Request without Accept header means that client expects anything, like if it has specified */*. Basically if you have two methods that differ only by @Produces and Accept header means "any", there is no way for a JAX-RS framework how to choose the method, so according to spec it chooses the first one (See JSR-311 3.7.2)

I believe that the best solution will be sending Accept header with an exact type.
Otherwise you can differ methods by different URLs: add @Path("/xml") and @Path("/atom") to the methods.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文