JsonView 返回空的 json 对象

Posted

技术标签:

【中文标题】JsonView 返回空的 json 对象【英文标题】:JsonView returning empty json objects 【发布时间】:2017-08-31 17:42:52 【问题描述】:

我正在尝试实现一个 JsonView 来选择性地序列化实体中的字段,但是被序列化的 json 具有没有字段的空对象。以下是我的代码:

视图类:

public class AuditReportView 
   public interface Summary 

实体:

@Entity
@SequenceGenerator(name = "AUDIT_REPORT_SEQUENCE_GENERATOR", sequenceName = "EJB_AUDIT_REPORT_SEQ", initialValue = 1, allocationSize = 1)
@Table(name = "DEVICE_AUDIT_REPORT")
@Data
public class AuditReport implements Serializable 

   private static final long serialVersionUID = 1246376778314918671L;

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AUDIT_REPORT_SEQUENCE_GENERATOR")
   @Column(name = "ID", nullable = false)
   @JsonView(AuditReportView.Summary.class)
   private Long id;

   @Column(name = "DEVICE_ID", nullable = false)
   @JsonView(AuditReportView.Summary.class)
   private String deviceId;

   @Column(name = "REPORT_TIMESTAMP", nullable = false)
   @JsonView(AuditReportView.Summary.class)
   private Calendar reportTimestamp;

   @Column(name = "USER_ID", nullable = false)
   @JsonView(AuditReportView.Summary.class)
   private long userId;

   @Column(name = "USERNAME", nullable = false)
   @JsonView(AuditReportView.Summary.class)
   private String username;

   @Column(name = "START_DATE", nullable = false)
   @JsonView(AuditReportView.Summary.class)
   private Calendar startDate;

   @Column(name = "END_DATE", nullable = false)
   @JsonView(AuditReportView.Summary.class)
   private Calendar endDate;

   @OneToMany(mappedBy = "auditReport", fetch = FetchType.LAZY, orphanRemoval = true, cascade=CascadeType.ALL)
   private Set<AuditEntry> auditEntries = new HashSet<AuditEntry>();

控制器:

   @JsonView(AuditReportView.Summary.class)
   @RequestMapping(method = RequestMethod.GET, value = "auditReportSummary")
   public @ResponseBody ResponseEntity<?> getAuditReportSummary()
   
      final List<AuditReport> auditReports = auditDAO.getAuditReportSummary();

      return new ResponseEntity<>(auditReports, HttpStatus.OK);
   

来自 Postman 的 JSON:

[
  ,
  ,
  
]

数据库只有 3 个结果,当我调试它时肯定会将它们拉出来,只是没有成员被序列化。我正在使用 Spring 4.3.7 和 Jackson 2.8.7。关于可能出现什么问题或从哪里开始调试问题的任何想法?

谢谢

【问题讨论】:

我也有同样的问题。有这方面的消息吗? 你还有这个问题吗?问题很老,从那时起可以进行很多更改。 嗨@Json 你能粘贴导入吗?我可以看到一个“@Data”注释,但我不确定它是否是 lombok 注释,如果不是,则缺少 getter 和 setter。 【参考方案1】:

您必须为属性创建 getter 和 setter 方法。我做到了,它奏效了。

【讨论】:

是的,但是这里 OP 使用了 Lombok 注释 @Data ,但不应该是这种情况【参考方案2】:

我猜这个问题是由于@ResponceBody ResponseEntity&lt;?&gt; 请尝试以下代码:

   @JsonView(AuditReportView.Summary.class)
   @RequestMapping(method = RequestMethod.GET, value = "auditReportSummary" produces = MediaType.APPLICATION_JSON_VALUE)
   public List<AuditReport getAuditReportSummary()
   
      final List<AuditReport> auditReports = auditDAO.getAuditReportSummary();

      return auditReports;
   

我不太确定,但你可以试试它是否有效..

【讨论】:

【参考方案3】:

尝试添加默认构造函数 - 例如:

public AuditReport() 

如果代码中没有指定自定义构造函数,则默认构造函数由 java 编译器生成。但是,如果指定了自定义构造函数,则不再自动添加默认构造函数,这可能会破坏序列化库/弹簧等。

但是 - 你还没有指定构造函数 - 这怎么可能?

我注意到的一件事是您正在使用 Lombok - 由于 Data 注释。 Lombok 可以为类生成构造函数。因此,您使用的注释或库之一可能是添加构造函数,使编译器跳过默认构造函数的生成,这可能会破坏您的序列化。

所以,我希望添加一个默认构造函数对你有用。

【讨论】:

以上是关于JsonView 返回空的 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

利用@jsonView注解来实现自定义返回字段

ModelAndView返回json对象的方法

Elasticsearch 返回空的 json 对象

从对象处理空的Json数组

如何处理空的 JSON 对象?

如何使用 Grails 4 JSON 视图呈现域对象的地图