JsonView, возвращающий пустые объекты JSON

Я пытаюсь реализовать 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);
   }

Джсон из Почтальона:

[
  {},
  {},
  {}
]

База данных имеет только 3 результата, и когда я отлаживаю, она однозначно извлекает их, просто не происходит сериализации членов. Я использую Spring 4.3.7 и Jackson 2.8.7. Любые идеи о том, что может быть не так или с чего начать отладку проблемы?

Спасибо

1 ответ

Вы должны создать методы получения и установки для атрибутов. Я сделал это, и это сработало.

Я думаю, что проблема связана с @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;
   }

Я не очень уверен в этом, но вы можете попробовать, если это работает..

Попробуйте добавить конструктор по умолчанию - например:

public AuditReport() {}

Конструктор по умолчанию генерируется компилятором java, если в коде не указан пользовательский конструктор. Однако, если указан пользовательский конструктор, конструктор по умолчанию больше не добавляется автоматически, что может нарушить сериализацию библиотек / пружин и т. Д.

НО - вы не указали конструктор - как это может быть?

Одна вещь, которую я заметил, это то, что вы используете Lombok - из-за аннотации данных. Ломбок может генерировать конструкторы для классов. Таким образом, возможно, одна из аннотаций или библиотек, которые вы используете, - это добавление конструктора, в результате чего компилятор пропускает генерацию конструктора по умолчанию, что может нарушить вашу сериализацию.

Итак, я надеюсь, что добавление конструктора по умолчанию сработает для вас.

Другие вопросы по тегам