Сравнивать только специально аннотированные свойства с JaVers?

У меня есть следующая модель домена. Аннотации NB Jackson @JsonView для полей:

public interface JSONInvoiceBasicView {

    }

    public interface JSONInvoiceWithLinesView extends JSONInvoiceBasicView {

    }

    public interface JSONInvoiceWithLinesViewExt extends JSONInvoiceWithLinesView { 
    }

}

@PersistenceUnit(unitName="ERP_PU")
@Entity 
@Table(name="INVOICE")
public class Invoice extends FrameworkEntity {

    @Id
    @SequenceGenerator(name = "PK_INVOICE_GEN", sequenceName = "PK_INVOICE_GEN", allocationSize=1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PK_INVOICE_GEN")
    @Column(name = "ID")
    @JsonView(JSONInvoiceView.JSONInvoiceBasicView.class)
    private Long id;

    @OneToMany(mappedBy="invoiceLine", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JsonView(JSONInvoiceView.JSONInvoiceWithLinesView.class)
    @JsonManagedReference
    private List<InvoiceLine> lines = new ArrayList<InvoiceLine>();

    @Temporal(TemporalType.DATE)
    @Column(name = "DATE")
    @JsonView(JSONInvoiceView.JSONInvoiceBasicView.class)
    private Date startDate;

    //...
}

@PersistenceUnit(unitName="ERP_PU")
@Entity 
@Table(name="INVOICE_LINE")
public class InvoiceLine extends FrameworkEntity {

    @Id
    @Column(name = "ID")
    @JsonView(JSONInvoiceView.JSONInvoiceWithLinesView.class)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name="FK_INVOICE")
    @JsonBackReference
    private Invoice invoice;

    @Column(name = "AMOUNT")
    @JsonView(JSONInvoiceView.JSONInvoiceWithLinesView.class)
    private BigDecimal amount;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name="FK_GOOD")
    @JsonView(JSONInvoiceView.JSONInvoiceWithLinesExtView.class)
    private Good good;

    //...
}
@PersistenceUnit(unitName="ERP_PU")
@Entity 
@Table(name="GOOD")
public class Good extends FrameworkEntity {

    @Id
    @Column(name = "ID")
    private Long id;

    @Column(name = "DESCRIPTION", length=200)
    private String description;

//...
}

Итак, моя проблема в том, что я получаю только подграф всего графа объектов, например. только сущности Invoice и InvoiceLine с полями, аннотированными @JsonView(JSONInvoiceView.JSONInvoiceWithLinesView.class), т.е. я не иду дальше и не получаю сущность invoice.invoiceLine[i].good. Мой вопрос: могу ли я сократить процесс сравнения JaVers, могу ли я попросить JaVers сравнить только подмножество графа объектов - то подмножество, которое аннотировано, например. с @JsonView(JSONInvoiceView.JSONInvoiceWithLinesView.class)?

В моем вопросе упоминаются аннотации Jackson @JsonView для полей сущностей, но я предполагаю, что если JaVers поддерживает такую ​​фильтрацию наблюдаемых свойств, то эту фильтрацию можно выполнить с помощью любого набора аннотаций, подходящих для полей/свойств, будь то Джексон или созданный пользователем.

Я слышал об аннотации @DiffIgnore JaVers, я ищу обобщение и оптимизацию этого механизма.

Мой сценарий таков: я получаю подграф, я отправляю его в Angular, а затем я получаю обновленный подграф от Angular, и я хочу объединить его обратно в свой бэкэнд.


person TomR    schedule 18.07.2017    source источник


Ответы (1)


Для этого есть новая аннотация - @DiffInclude. Он работает как положительный фильтр для свойств класса.

@DiffInclude — объявляет свойство видимым для JaVers. Другие свойства данного класса игнорируются (если они явно не включены). Включение — это противоположный подход к игнорированию, например, занесение в черный или белый список. Вы можете использовать только один подход для данного класса.

см. https://javers.org/documentation/domain-configuration/#property-level-annotations

person Bartek Walacik    schedule 19.07.2017
comment
В большинстве случаев вы на самом деле не хотите, чтобы все регистрировалось, а только основные свойства (определенно наш случай). Убедиться, что разработчики не забывают исключать это конкретное свойство/геттер всякий раз, когда они его добавляют, похоже на то, как Windows автоматически перезагружает компьютер для установки обновлений. Не самый лучший. - person Stef; 14.10.2017