gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:28:39 29 4
gpt4 key购买 nike

我有两个简单的类:

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.最终

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) 被完全忽略。

最佳答案

我知道这是一篇过时的帖子,但我最近遇到了同样的问题,不过我会回来更新这篇帖子。

当使用 Jackson 进行序列化时,JAXB 注释(如 XmlAccessorType)似乎被忽略了,Jersey 使用了序列化引擎>(您上面的 REST Controller 是 Jersey)。

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

@JsonAutoDetect( JsonMethod.NONE )@XmlAccessorType 的位置(或者如果您要在任何时候使用真正的 JAXB 则结合使用) ( XmlAccessType.NONE )

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

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

关于java - JAXB 注释被忽略(@XmlAccessorType(XmlAccessType.NONE) 和@XmlTransient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19633629/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com