1

我有两个简单的类:

import javax.xml.bind.annotation.*;

@XmlRootElement(name="address")
@XmlAccessorType(XmlAccessType.FIELD)
public class Address {

    @XmlElement(required=true) 
    protected int number;

    @XmlElement(required=true)  
    protected String street;

    @XmlTransient
    protected String city;

    public Address() { }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    @XmlTransient
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
}

和:

import javax.xml.bind.annotation.*;

@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.NONE)
public class Customer {

    @XmlAttribute(required=true) 
    protected int id;

    @XmlElement(required=true) 
    protected String firstname;

    @XmlElement(required=true) 
    protected String lastname;

    @XmlTransient
    protected Address address;

    public Customer() { }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastName) {
        this.lastname = lastName;
    }

    @XmlTransient
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

资源方法:

@GET
@Path("{id}")
@Produces({"application/json"})
public Customer getCustomer(@PathParam("id") String id) {
    Customer customer = null;
    try {
        customer = JpaEmu.findById(id);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return customer;   // null = 204
}

我希望 JSON 对象不包含地址,但是 GET 请求返回:

{"id":1,"firstname":"Duke2","lastname":"NukEm","address":{"number":23,"street":"Hollywood Holocaust","city":"L.A."}}

运行:Jboss7,我唯一的依赖是:

jboss-javaee-6.0 3.0.2.Final

web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

  <servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>

似乎 JAXB 注释没有参与解析为 JSON 的过程,尤其是:@XmlTransient & @XmlAccessorType(XmlAccessType.NONE) 被强制忽略。

4

2 回答 2

3

我知道这是一个有点旧的帖子,但我最近遇到了同样的问题,虽然我会回来更新这篇文章。

使用序列化引擎(您上面的 REST 控制器是)使用序列化引擎时,似乎会忽略类似的JAXB注释。XmlAccessorTypeJacksonJerseyJersey

这篇文章为我指明了正确的方向。看来你也应该使用

@JsonAutoDetect( JsonMethod.NONE )在适当的位置(或与如果您将JAXB在任何时候使用 true 一起使用)@XmlAccessorType( XmlAccessType.NONE )

使用这种方法让我立竿见影。

您还需要使用@JsonProperty注释而不是@XmlElement属性(除非您将JAXB在任何时候使用 true on 来序列化对象)。

于 2015-03-04T15:31:17.407 回答
2

由于没有像 XML 绑定(JAXB、JSR-222)那样的 JSON 绑定标准,因此 JAX-RS 实现可以选择如何支持它。在 JBoss 的情况下,它似乎使用了一种不利用 JAXB 元数据的方法。

于 2013-10-28T11:59:19.060 回答