我有使用新泽西州JAX-RS REST服务实现。一个JAX-RS的很酷的功能/新泽西州是一个POJO如何轻松可以变成一个REST服务,通过简单地洒一些Java注释...包括很轻松机制转换的POJO以JSON - 使用JAXB注释

现在,我想能够采取的非REST的目的这凉爽的JSON-ifying功能优势 - 我很想能够只是一些序列化这些对象到磁盘,因为JSON文本。下面是我要序列的示例JAXB对象:

@XmlRootElement(name = "user")
public class UserInfoImpl implements UserInfo {

    public UserInfoImpl() {} 

    public UserInfoImpl(String user, String details) {
        this.user = user;
        this.details = details;
    }

    public String getUser() { return user; }
    public void setUser(String user) { this.user = user; }

    public String getDetails() { return details; }
    public void setDetails(String details) { this.details = details; }

    private String user;
    private String details;
}

泽西可以把这些中的一个为JSON,没有额外的信息。我不知道是否球衣像我这样需要在API中暴露了这个功能?我已经没有运气找到它到目前为止...

谢谢!

更新2009-07-09 :据我了解,我可以使用供应商反对的几乎的做我想做什么:

  @Context Providers ps;
  MessageBodyWriter uw = ps.getMessageBodyWriter(UserInfoImpl.class, UserInfoImpl.class, new Annotation[0], MediaType.APPLICATION_JSON_TYPE);

  uw.writeTo(....)

...此写入对象作为JSON任何的OutputStream,这将是完美的我,但我只能得到在供应对象使用@Context从@Component对象。有谁知道如何从一个普通的,未标注的POJO访问它?谢谢!

有帮助吗?

解决方案

泽西使用了几个不同的框架依赖于是否使用映射(),badgerfish(),或天然的()表示法。自然通常是一个人想要的。这就是使用非常好(和非常快)独立杰克逊JSON处理器,笔者认为,从对象 - > JAXB-> JSON去实现。但是杰克逊还提供它自己的JAX-RS供应商去直接对象 - > JSON。

在事实上,它们甚至增加了对JAXB注释的支持。看看

http://wiki.fasterxml.com/JacksonJAXBAnnotations

我认为这是最终你在找什么。杰克逊没有对象< - > JSON处理...球衣只是让你的来电

其他提示

下面是一个使用JAXB映射对象JSON的一个简单的简单的例子(使用杰克逊):

http://ondra.zizka.cz/ stranky / programovani / JAVA / JAXB-JSON-杰克逊howto.texy

ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(pojoObject);

JAXB注解序列化到XML时很好地工作。 主要的问题是,JAXB不支持空数组。因此,序列化这样的事情的时候...

List myArray = new ArrayList();

...经由JAXB anottations到JSON所有空数组成为零,而不是[]。

要解决这个问题,你可以通过刚才杰克逊直接系列化你的POJO到JSON。

以泽西的用户手册,看看这个: http://jersey.java.net/nonav/documentation/latest /user-guide.html#d0e1959

这是使用杰克逊提供商而不JAXB的最佳方式。此外,你可以随时在其网站downlaoding杰克逊全X.Y.Z-JAR使用最新版本的杰克逊。

这个方法不会与你的JAXB标注干涉,所以我会建议一试!

由于泽西是JAX-RS和JAX-RS的参考实现完全专注于提供实现终点用于序列化的有效负载的问题是留给其他标准REST服务的标准方式。

我认为,如果他们包含在JAX-RS对象序列化标准,将很快成为一个大的多头野兽,这将是难以实现和宽松一些的它的焦点。

我认识到如何集中新泽西州是提供清洁,简单易用的REST端点。在我的情况我刚才子类具有所有JAXB水暖之间的二进制和XML是非常干净这么编组对象父。

随着一点点的球衣特定的自举,你可以用它来创建必要的JSON对象为您服务。您需要包括以下依存关系(可以使用捆绑,但如果你正在使用焊接测试就会造成问题):

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.12</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.12</version>
    </dependency>

从那里,你可以创建一个JAXB注解类。以下是一个例子:

@XmlRootElement
public class TextMessage {
private String text;
    public String getText() { return text; }
    public void setText(String s) { this.text = text; }
}

然后可以创建以下单元测试:

    TextMessage textMessage = new TextMessage();
    textMessage.setText("hello");
    textMessage.setUuid(UUID.randomUUID());

    // Jersey specific start
    final Providers ps = new Client().getProviders();
    // Jersey specific end
    final MultivaluedMap<String, Object> responseHeaders = new MultivaluedMap<String, Object>() {

        @Override
        public void add(final String key, final Object value) {
        }

        @Override
        public void clear() {
        }

        @Override
        public boolean containsKey(final Object key) {
            return false;
        }

        @Override
        public boolean containsValue(final Object value) {
            return false;
        }

        @Override
        public Set<java.util.Map.Entry<String, List<Object>>> entrySet() {
            return null;
        }

        @Override
        public List<Object> get(final Object key) {
            return null;
        }

        @Override
        public Object getFirst(final String key) {
            return null;
        }

        @Override
        public boolean isEmpty() {
            return false;
        }

        @Override
        public Set<String> keySet() {
            return null;
        }

        @Override
        public List<Object> put(final String key, final List<Object> value) {
            return null;
        }

        @Override
        public void putAll(
                final Map<? extends String, ? extends List<Object>> m) {
        }

        @Override
        public void putSingle(final String key, final Object value) {
        }

        @Override
        public List<Object> remove(final Object key) {
            return null;
        }

        @Override
        public int size() {
            return 0;
        }

        @Override
        public Collection<List<Object>> values() {
            return null;
        }
    };

    final MessageBodyWriter<TextMessage> messageBodyWriter = ps
            .getMessageBodyWriter(TextMessage.class, TextMessage.class,
                    new Annotation[0], MediaType.APPLICATION_JSON_TYPE);
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Assert.assertNotNull(messageBodyWriter);

    messageBodyWriter.writeTo(textMessage, TextMessage.class,
            TextMessage.class, new Annotation[0],
            MediaType.APPLICATION_JSON_TYPE, responseHeaders, baos);
    final String jsonString = new String(baos.toByteArray());
    Assert.assertTrue(jsonString.contains("\"text\":\"hello\""));

这种方法的优点是它使JEE6 API中的一切,都明确需要,除了用于测试和获得供应商没有外部库。但是,您需要因为在标准提供什么也没有创建MultivaluedMap的实现,我们不使用它。它也比GSON慢,很多更复杂的比必要的。

我理解XML的观点,但它会显示出一些先见之明,需要的POJO作为标准设备JSON支持。有对医生了JSON标识符有特殊字符是没有意义的,如果你的实现是JSON和你的客户是一个JavaScript RIA。

另外,不是Java组件是NOT的POJO。我想用这样的事情我的web层的外表面:

public class Model
{
   @Property height;
   @Property weight;
   @Property age;
}

没有默认的构造函数,没有任何的getter / setter噪音,只是我自己的注解POJO。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top