RESTEasy JSON JAXB неустрашимый вопрос - PullRequest
1 голос
/ 29 июня 2011

Я пишу небольшое твиттероподобное приложение в Play!с простым REST API, используя RESTEasy.У меня есть простой ресурс:

@GET
@Path("/tweets/all")
@Produces("application/xml")
public TweetList all(@QueryParam("page") @DefaultValue("1") Integer page) {
    //return Tweet.find("order by dateCreated desc").fetch(page, 100);
    List<Tweet> l = Tweet.find("order by dateCreated desc").fetch(page, 100);
    return new TweetList(l);
}

У меня также есть этот маленький класс оболочки:

    @XmlRootElement(name = "tweetList")
    private class TweetList {

        private List<Tweet> tweets;

        public TweetList(List<Tweet> tweets) {
            this.tweets = tweets;
        }

        public TweetList() {
        }

        @XmlElement(name = "tweet")
        public List<Tweet> getTweets() {
            return tweets;
        }

        public void setTweets(List<Tweet> tweets) {
            this.tweets = tweets;
        }
    }

На стороне клиента у меня есть аналогичный класс оболочки и интерфейс на стороне клиента для прокси RESTEasy.создание, это выглядит так:

@GET
@Path("/tweets/all")
@Produces("application/xml")
public TweetList all(@QueryParam("page") @DefaultValue("1") Integer page);

Мой код для получения данных:

Tweet tweet = ProxyFactory.create(Tweet.class, "http://localhost:9000/rest");

        TweetList tweetList = tweet.all(null);

        for(rest.client.beans.Tweet t : tweetList.getTweets()){
            System.out.printf("%s wrote %s, %s \n", t.author.fullName, t.content, t.id);
        }

И это прекрасно работает для XML - все твиты печатаются на экране в порядке,Проблема в том, что я хотел бы использовать JSON в качестве формата возврата.Когда я меняю свой ресурс и аннотацию @Produces прокси на @Produces ("application / json"), я получаю следующее сообщение об ошибке:

Unrecognized field "tweetList" (Class rest.client.wrappers.TweetList), not marked as ignorable

Моя оболочка на стороне клиента:

@XmlRootElement(name = "tweetList")
public class TweetList {


    private List<Tweet> tweets;

    public TweetList(List<Tweet> tweets) {
        this.tweets = tweets;
    }

    public TweetList() {
    }


    public List<Tweet> getTweets() {
        return tweets;
    }

    @XmlElement(name = "tweet")
    public void setTweets(List<Tweet> tweets) {
        this.tweets = tweets;
    }
}

И я не знаю, как обойти эту проблему.Пример вывода при вызове моего ресурса вручную в браузере:

XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tweetList>
      <tweet>
            <id>129</id>
            <content>aksjdlkajsdlkjaskjdajdlakjsdljasdlkjakdjaljdlkajsd kajsdlkajsdl kajsdlkajsdl asdlkja lkdsjalksd</content>
            <author>
                  <id>1</id>
                  <login>admin</login>
                  <fullName>Administrator</fullName>
            </author>
            <dateCreated>2011-06-13T21:08:03.145+02:00</dateCreated>
      </tweet>
      <tweet>
            <id>98</id>
            <content>Donec pulvinar porta feugiat. Sed adipiscing eros at libero mollis commodo. Duis auctor, tortor ac ultricies facilisis, purus velit fermentum elit, id luctus diam enim et felis.</content>
            <author>
                  <id>2</id>
                  <login>user1</login>
                  <fullName>UserOne</fullName>
            </author>
            <dateCreated>2011-04-30T02:00:00+02:00</dateCreated>
      </tweet>
</tweetList>

JSON:

{
   "tweetList":{
      "tweet":[
         {
            "id":129,
            "content":"aksjdlkajsdlkjaskjdajdlakjsdljasdlkjakdjaljdlkajsd kajsdlkajsdl kajsdlkajsdl asdlkja lkdsjalksd",
            "author":{
               "id":1,
               "login":"admin",
               "fullName":"Administrator"
            },
            "dateCreated":"2011-06-13T21:08:03.145+02:00"
         },
         {
            "id":98,
            "content":"Donec pulvinar porta feugiat. Sed adipiscing eros at libero mollis commodo. Duis auctor, tortor ac ultricies facilisis, purus velit fermentum elit, id luctus diam enim et felis.",
            "author":{
               "id":2,
               "login":"user1",
               "fullName":"UserOne"
            },
            "dateCreated":"2011-04-30T02:00:00+02:00"
         }
      ]
   }
}

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Попробуйте отформатировать ваш запрос json так:

{
  "tweet":[
     {
        "id":129,
        "content":"aksjdlkajsdlkjaskjdajdlakjsdljasdlkjakdjaljdlkajsd kajsdlkajsdl kajsdlkajsdl asdlkja lkdsjalksd",
        "author":{
           "id":1,
           "login":"admin",
           "fullName":"Administrator"
        },
        "dateCreated":"2011-06-13T21:08:03.145+02:00"
     },
     {
        "id":98,
        "content":"Donec pulvinar porta feugiat. Sed adipiscing eros at libero mollis commodo. Duis auctor, tortor ac ultricies facilisis, purus velit fermentum elit, id luctus diam enim et felis.",
        "author":{
           "id":2,
           "login":"user1",
           "fullName":"UserOne"
        },
        "dateCreated":"2011-04-30T02:00:00+02:00"
     }
  ]
}

Это то, что я должен был сделать для всех моих запросов json.Я не знаю, почему это работает так, а не иначе.

0 голосов
/ 30 июня 2011

Это может зависеть от того, какого провайдера json вы используете, но сначала попробуйте переместить @ XmlElement (name = "tweet") из метода установки в метод получения (getTweets) в оболочке на стороне клиента. Все остальное выглядит нормально.

...