忽略JAXB注释(@XmlAccessorType(XmlAccessType.NONE)和@XmlTransient

时间:2013-10-28 11:30:02

标签: java jboss jaxb jax-rs resteasy

我有两个简单的类:

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&amp;

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

JAXB使用XmlAccessorType进行序列化时似乎忽略Jackson注释JerseyJersey使用的序列化引擎(上面的REST控制器为@JsonAutoDetect( JsonMethod.NONE ) )。

This post指出了我正确的方向。看来你也应该使用

JAXB到位(或者如果您将在任何时候使用真@XmlAccessorType( XmlAccessType.NONE )@JsonProperty

使用此方法可以立即获得结果。

您还希望使用@XmlElement注释而不是JAXB属性(除非您将使用true {{1}}来序列化任何时候的对象)。

相关问题