我正在尝试实现一个JsonView来选择性地序列化实体中的字段,但序列化的json具有没有字段的空对象。以下是我的代码:
viewClass类:
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。任何可能出错的想法或从何处开始调试问题?
由于
答案 0 :(得分:0)
您必须为属性创建getter和setter方法。我做到了,并且有效。
答案 1 :(得分:0)
我猜这是由于@ResponceBody ResponseEntity<?>
请尝试以下代码:
@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;
}
我不太确定,但是可以尝试一下。
答案 2 :(得分:0)
尝试添加默认构造函数-例如:
public AuditReport() {}
如果代码中未指定自定义构造函数,则默认构造函数由java编译器生成。但是,如果指定了自定义构造函数,则不再自动添加默认构造函数,这可能会破坏序列化库/ spring等。
但是-您尚未指定构造函数-怎么可能?
我注意到的一件事是由于数据注释,您正在使用Lombok。 Lombok可以为类生成构造函数。因此,您可能使用的注释或库之一是添加一个构造函数,使编译器跳过默认构造函数的生成,这可能会破坏您的序列化。
所以,我希望添加一个默认构造函数对您有用。