2011-04-13 3 views
1

Что такое содержимое по умолчанию, возвращаемое, когда заголовок accept пуст?Тип содержимого, когда заголовок принятия пуст или неизвестен jax-rs

Приведенный ниже код возвращает приложение/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; 
    } 
} 

ответ

3

Запрос без Accept заголовка означает, что клиент ожидает ничего, как если бы он указал */*. В принципе, если у вас есть два метода, которые отличаются только @Produces, а заголовок Accept означает «any», для механизма JAX-RS нет способа выбрать метод, поэтому согласно спецификации он выбирает первый (см. JSR-311 3.7 .2)

Я считаю, что лучшим решением будет отправка заголовка Accept с точным типом. В противном случае вы можете отличать методы по различным URL-адресам: добавьте @Path("/xml") и @Path("/atom") к методам.

+0

В моих тестовых случаях я использую rssOwl в качестве клиента для отдыха. rssOwl отправляет пустой заголовок accept. Это может быть ситуация с несколькими другими клиентами ATOM. Один из способов справиться с этим - использовать согласование контента на основе URL, но я предпочитаю использовать заголовок, следовательно, вышеупомянутый вопрос. –

+1

Вы не можете сделать это с помощью чистого JAX-RS. С быстрыми клавишами поддержки содержимого Apache Wink. Ярлыки передаются как параметр запроса в url, поэтому вызов ATOM будет http: // host: port/app? Alt = atom. См. Http://incubator.apache.org/wink/1.1/html/5.1%20Registration%20and%20Configuration.html – Tarlog

+0

Я приму ваше предыдущее предложение. Я собираюсь реализовать согласование контента на основе URL, по крайней мере для основных каналов. –

Смежные вопросы