- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 JPA 和 JSON 序列化的 Spring-Boot-Project。我尝试使用 @JsonView 仅序列化指定的属性。它工作正常,但对于我在 Order
中的关联(例如 order.user),它序列化了空 Json 对象。
我使用以下依赖项
查看以下 Json 结果:
{
"content" : {
"orderResources" : [ {
"receiptDate" : "2019-08-14",
"state" : "BILL_CREATED",
"user" : { },
"employer" : { },
"orderplace" : { },
"propertyManagement" : null,
"plannings" : [ { } ]
}, {
"receiptDate" : "2019-08-17",
"state" : "BILL_CREATED",
"user" : { },
"employer" : { },
"orderplace" : { },
"propertyManagement" : null,
"plannings" : [ ]
} ]
},
"links" : {
"next" : {
"href" : "https://orderbook-demo.localhost:8443/api/order?page=1"
},
"1" : {
"href" : "https://orderbook-demo.localhost:8443/api/order?page=1"
}
},
"page" : {
"size" : 6,
"totalElements" : 2,
"totalPages" : 1,
"number" : 0
}
}
我的实体
订单
@Entity
@JsonRootName("Order")
@BatchSize(size = 100 )
@Table(name="`order`")
@Access(AccessType.FIELD)
public class Order extends BaseEntity {
private static final long serialVersionUID = 1L;
@Column(name="receipt_date", nullable = false)
@Type(type = "de.orderbook.hibernate.type.LocalDateUserType")
@JsonSerialize(using = LocalDateJsonSerializer.class)
@JsonDeserialize(using = LocalDateJsonDeserializer.class)
@JsonProperty
@JsonView(View.ListView.class)
private LocalDate receiptDate;
@Column(name="state", nullable = false)
@Enumerated(value = EnumType.STRING)
@JsonProperty
@JsonView(View.ListView.class)
private State state = State.OPEN;
@ManyToOne
@JoinColumn(name = "offer_id")
@JsonProperty
@JsonIgnore
private Offer offer;
@OneToMany(targetEntity = OrderOrderdetail.class, mappedBy = "order", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
@BatchSize(size = 100)
@JsonProperty
private List<OrderOrderdetail> orderdetails = new ArrayList<>(10);
@ManyToOne(targetEntity = Address.class, cascade = CascadeType.ALL)
@JoinColumn(name= "employer_id")
@Fetch(FetchMode.SELECT)
@BatchSize(size = 100)
@JsonProperty
@JsonView(View.ListView.class)
private Address employer;
@ManyToOne(targetEntity = Address.class, cascade = CascadeType.ALL)
@JoinColumn(name= "orderplace_id")
@Fetch(FetchMode.SELECT)
@BatchSize(size = 100)
@JsonProperty
@JsonView(View.ListView.class)
private Address orderplace;
@ManyToOne(targetEntity = Address.class, cascade = CascadeType.ALL)
@JoinColumn(name= "property_management_id")
@Fetch(FetchMode.SELECT)
@BatchSize(size = 100)
@JsonProperty
@JsonView(View.ListView.class)
private Address propertyManagement;
@ManyToOne
@JoinColumn(name="user_id")
@BatchSize(size = 100 )
@JsonProperty
@JsonView(View.ListView.class)
private User user;
@OneToMany(targetEntity = Planning.class, mappedBy = "order", cascade = CascadeType.ALL)
@BatchSize(size = 100 )
@JsonProperty
@JsonView(View.ListView.class)
private List<Planning> plannings = new ArrayList<Planning>(3);
public Order() {
super();
}
public Order(Offer offer) {
super();
this.receiptDate = LocalDate.now();
this.employer = offer.getEmployer();
this.orderplace = offer.getOrderplace();
this.propertyManagement = offer.getPropertyManagement();
this.user = offer.getUser();
this.offer = offer;
for (OfferOrderdetail orderdetail : offer.getOrderdetails()) {
OrderOrderdetail orderOrderdetail = new OrderOrderdetail(orderdetail.getOrderdetail(), orderdetail.getCount());
orderOrderdetail.setOrder(this);
this.getOrderdetails().add(orderOrderdetail);
}
}
@JsonCreator
public Order(@JsonProperty("receiptDate") LocalDate receiptDate,
@JsonProperty("state") State state,
@JsonProperty("user") User user,
@JsonProperty("employer") Address employer,
@JsonProperty("orderplace") Address orderplace,
@JsonProperty("propertyManagement") Address propertyManagement,
@JsonProperty("orderdetails") List<OrderOrderdetail> orderdetails,
@JsonProperty("plannings") List<Planning> plannings
) {
super();
this.receiptDate = receiptDate;
this.state = state;
this.user = user;
this.employer = employer;
this.orderplace = orderplace;
this.propertyManagement = propertyManagement;
this.orderdetails = orderdetails;
this.plannings = plannings;
}
public LocalDate getReceiptDate() {
return receiptDate;
}
public void setReceiptDate(LocalDate receiptDate) {
this.receiptDate = receiptDate;
}
public List<OrderOrderdetail> getOrderdetails() {
return orderdetails;
}
public void setOrderdetails(List<OrderOrderdetail> orderdetails) {
this.orderdetails = orderdetails;
}
public void addOrderdetail(OrderOrderdetail orderdetail) {
this.orderdetails.add(orderdetail);
}
public void removeOrderdetail(OrderOrderdetail orderdetail) {
this.orderdetails.remove(orderdetail);
}
public boolean containsOrderdetail(OrderOrderdetail orderdetail) {
return this.orderdetails.contains(orderdetail);
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public List<Planning> getPlannings() {
return plannings;
}
public void addPlanning(Planning planning) {
this.plannings.add(planning);
}
public void removePlanning(Planning planning) {
this.plannings.remove(planning);
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public Address getEmployer() {
return employer;
}
public void setEmployer(Address employer) {
this.employer = employer;
}
public Address getOrderplace() {
return orderplace;
}
public void setOrderplace(Address orderplace) {
this.orderplace = orderplace;
}
public Address getPropertyManagement() {
return propertyManagement;
}
public void setPropertyManagement(Address propertyManagement) {
this.propertyManagement = propertyManagement;
}
public void setPlannings(List<Planning> plannings) {
this.plannings = plannings;
}
public Offer getOffer() {
return offer;
}
public void setOffer(Offer offer) {
this.offer = offer;
}
}
用户
@Entity
@Table(name="`user`")
@JsonView(View.ListView.class)
public class User extends BaseEntity {
private static final long serialVersionUID = 1L;
@JsonProperty
@JsonView(View.ListView.class)
private String name;
@NaturalId
@JsonProperty
@JsonView(View.ListView.class)
private String username;
@JsonProperty
@JsonView(View.ListView.class)
private String email;
private @JsonIgnore String password;
@JsonProperty
@JsonView(View.ListView.class)
private boolean enabled;
@OneToMany(targetEntity = Authority.class)
@JoinColumn(name = "username", referencedColumnName = "username")
@BatchSize(size = 100)
@JsonProperty
@JsonView(View.ListView.class)
private List<Authority> roles;
public User() {
super();
}
public User(String username, String name, String password, String email, boolean enabled, Authority... roles) {
super();
this.username = username;
this.name = name;
this.email = email;
this.enabled = enabled;
this.setPassword(password);
this.roles = roles == null ? Collections.emptyList() : Arrays.asList(roles);
}
@JsonCreator
public User(@JsonProperty("username") String username, @JsonProperty("name") String name, @JsonProperty("email") String email, @JsonProperty("enabled") boolean enabled, @JsonProperty("roles") List<Authority> roles) {
super();
this.username = username;
this.name = name;
this.email = email;
this.enabled = enabled;
this.roles = roles == null ? Collections.emptyList() : roles;
}
public User(String username) {
super();
this.username = username;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Authority> getRoles() {
return roles;
}
public void setRoles(List<Authority> roles) {
this.roles = roles;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
}
我的 Controller
@Controller
public class OrderController extends BaseController<Order, OrderRepository> {
private static int PAGE_SIZE = 6;
@Autowired
private UserRepository userRepository;
@Autowired
private BillRepository billRepository;
@Transactional
@JsonView(View.ListView.class)
@RequestMapping(value = "/api/order", method = RequestMethod.GET, headers = "content-type=application/json", consumes = "*/*", produces = "application/json")
public @ResponseBody
HttpEntity<OrderPagedResource> findAll(Principal principal, @RequestParam(name="page") Long page) {
List<Order> list = super.list(page, Long.valueOf(PAGE_SIZE));
for (Order order : list) {
Hibernate.initialize(order.getPlannings());
Hibernate.initialize(order.getUser().getRoles());
}
List<OrderResource> resources = new OrderResourceAssembler().toResources(list);
Long count = this.repository.count();
return new HttpEntity<OrderPagedResource>(new OrderPagedResource(resources, new MyPagedMetadata(PAGE_SIZE, page, count)));
}
}
订单资源
public class OrderResource extends ResourceSupport {
@JsonUnwrapped
@JsonView(View.ListView.class)
private Order content;
public OrderResource(Order order) {
super();
this.content = order;
}
public Order getContent() {
return content;
}
public void setContent(Order content) {
this.content = content;
}
}
订单页面资源
public class OrderPagedResource extends PagedResources<OrderResource> {
private Map<String, MyLink> links = new HashMap(5);
public OrderPagedResource(Collection<OrderResource> content, PageMetadata metadata) {
super(content, metadata);
for (int i = 1; i <= metadata.getTotalPages(); i++) {
if (i == metadata.getNumber() - 1)
this.links.put("prev", new MyLink(linkTo(OrderController.class).slash("/api/order?page=" + i).withRel("prev")));
if (i == metadata.getNumber() + 1)
this.links.put("next", new MyLink(linkTo(OrderController.class).slash("/api/order?page=" + i).withRel("next")));
this.links.put(Integer.toString(i), new MyLink(linkTo(OrderController.class).slash("/api/order?page=" + i).withRel(Integer.toString(i))));
}
}
@Override
@JsonProperty("page")
@JsonView(View.ListView.class)
public PageMetadata getMetadata() {
return super.getMetadata();
}
@Override
@JsonProperty("content")
@JsonView(View.ListView.class)
public Collection<OrderResource> getContent() {
return super.getContent();
}
@JsonProperty("links")
@JsonView(View.ListView.class)
public Map<String, MyLink> getLinks2() {
return this.links;
}
public class MyLink extends Link {
private @XmlAttribute @JsonProperty @JsonView(View.ListView.class) String rel;
private @XmlAttribute @JsonProperty @JsonView(View.ListView.class) String href;
public MyLink(Link link) {
super(link.getHref(), link.getRel());
this.rel = link.getRel();
this.href = link.getHref();
}
public MyLink(String href) {
super(href);
this.href = href;
}
public MyLink(String href, String rel) {
super(href, rel);
this.href = href;
this.rel = rel;
}
public MyLink() {
}
@Override
@JsonView(View.ListView.class)
public String getRel() {
return this.rel;
}
@Override
@JsonView(View.ListView.class)
public String getHref() {
return this.href;
}
}
}
订单资源组装器
@Component
public class OrderResourceAssembler extends ResourceAssemblerSupport<Order, OrderResource> {
public OrderResourceAssembler() {
super(OrderController.class, OrderResource.class);
}
@Transactional
@Override
public OrderResource toResource(Order entity) {
OrderResource resource = new OrderResource(entity);
resource.add(linkTo(OrderController.class).slash("/api/order/" + entity.getId()).withSelfRel());
if (entity.getOffer() != null)
resource.add(linkTo(OrderController.class).slash("/api/offer/" + entity.getOffer().getId()).withRel("offer"));
resource.add(linkTo(UserController.class).slash("/api/user/" + entity.getUser().getId()).withRel("user"));
return resource;
}
}
最佳答案
默认情况下,Spring 不会将子对象中的属性包含到 @JsonView 中。您可以将 @JsonView 添加到子 POJO,或者通过应用以下配置来启用所有子属性。
spring.jackson.mapper.default-view-inclusion=true
关于java - 使用 @JsonView 的 Spring Json-Serialization 返回关联的空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57927165/
我使用自定义反序列化器,但是当我调用objectMapper.writerWithView(Views.MyView.class)时,我没有得到预期的结果。 在调试的时候,我发现在方法中 public
我有包装 JPA 实体的 UI 对象,并且在该 UI 对象的构造函数中,我对某些属性进行了延迟加载。在同一个构造函数中,我需要知道 JsonView 当前处于事件状态,因此我不会延迟加载一些不需要的字
我需要使用@JsonView 在反序列化时抛出异常。 我的 POJO: public class Contact { @JsonView( ContactViews.Person.class
以下内容将仅包含具有 JsonView(View.MyView.class) 注释的字段: @JsonView(View.MyView.class) @RequestMapping(value = "
我无法使用@JsonView 执行这个简单的示例。我做错了什么? ${jackson-2-version} = 2.6.5 com.fasterxml.jackson.core ja
我正在尝试使用 @JsonView 注释从 Spring 中的对象反序列化多个字段。但是,我将注释添加到我的方法中,它没有反序列化指定的字段,而是返回一个空对象。 这是我的 POJO: @Entity
我正在尝试为我的嵌套实体使用 @JsonView 注释。更清楚地说,假设我们有 2 个实体,每个实体都有自己的 View 类。 public class JsonViewAddress {
我有以下测试设置: public class TestingPojo { public int getA() { return 1; } @JsonView(T
我试图根据请求用户的角色有选择地隐藏响应中的某些字段。据我所知,来自 Jackson 的 JsonView 可能是正确的选择。 我需要能够显示所有字段,除非它们已标记有特定的访问级别。我为访问级别创建
我的一个类有 3 个相同类型的属性。现在我正在尝试将其序列化为 JSON,但其中一个属性需要以不同的方式序列化 - 基本上这些属性之一是“内部”,我只需要它的 id,其余属性必须完全序列化。 到目前为
我将 Jackson JSON 1.9.12 与 SpringMVC 一起使用。我创建了一个带有 JSON 字段的 dto。我想要两个具有不同 JSON 字段的相同 dto 配置文件,因此我创建了两个
jackson 2.2.2 ObjectMapper mapper = new ObjectMapper(); mapper.getSerializationConfig().withView(Vie
如何在不在该 Java 对象的每个字段上指定 @JsonView 的情况下将 Java 对象的所有字段包含到 JSON 响应( View )中? 编辑:我需要在不使用另一个外部库的情况下实现这一点。
我有类似于这两个类的东西: public class User { @JsonView(UserView.IdOnly.class) int userID; String na
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在开发一个 Spring boot(MVC、JPA)应用程序,它需要在不同的请求上返回不同的属性。我找到了 @JsonView 注释,它似乎有效。但是我需要用基本 View 来注释每个属性吗? 示
您好,我几乎没有相互嵌入的 UI 对象。示例 #1: class CarUI { public UserUI user; public UserUI agent; .... publi
我正在使用新的 CakePHP 2.1,并希望使用 JsonView 使我的 Controller 响应 JQuery 在客户端创建的 ajax 请求。但是,根据文档,这应该使用 JsonView 自
Spring 从 4.1 版本开始支持 @JsonView。 使用具有多个标识符的 @JsonView 注释 Spring Controller 的(使用 @RestController 注释)方法我
我有一个类包含另一个类的集合。 class A{ @JsonView(VerboseViewA.Minimal.class) String field1; @JsonView(VerboseVi
我是一名优秀的程序员,十分优秀!