我有两个简单的类:
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;
答案 0 :(得分:2)
由于没有像JSON绑定那样的标准(JAXB,JSR-222),JAX-RS impls可以选择如何支持它。在JBoss的情况下,似乎它使用的方法不使用JAXB元数据。
答案 1 :(得分:1)
我知道这是一个旧帖子,但我最近有同样的问题,虽然我回来更新这篇文章。
JAXB
使用XmlAccessorType
进行序列化时似乎忽略Jackson
注释Jersey
,Jersey
使用的序列化引擎(上面的REST控制器为@JsonAutoDetect( JsonMethod.NONE )
)。
This post指出了我正确的方向。看来你也应该使用
JAXB
到位(或者如果您将在任何时候使用真@XmlAccessorType( XmlAccessType.NONE )
)@JsonProperty
使用此方法可以立即获得结果。
您还希望使用@XmlElement
注释而不是JAXB
属性(除非您将使用true {{1}}来序列化任何时候的对象)。