2017-06-08 22 views
1

我有以下的(简化)类:龙目岛建造者在Spring数据缺省

@Entity 
@Data 
@Builder 
@NoArgsConstructor // @Builder creates the all-args version but I need this one elsewhere. 
@AllArgsConstructor(access = AccessLevel.PRIVATE) // Having @NoArgsConstructor disables the @AllArgsConstructor needed by @Builder unless I have this explicitly applied 
public class MyClass { 

    // ... 
    @Builder.Default 
    private String foo = "Some Default Value" 
    // ... 

} 

这正常在一般情况下,但问题来了什么时候该实体得到由春(尤其是Spring数据建存储库以响应创建它的REST请求)。 Spring会看到全参数构造函数并使用它,为foo设置一个空值(在这种情况下,它不是在POST数据中设置的),并且最终以foo为空值而不是预期的"Some Default Value"@Builder.Default

简单地创建setter并防止null值不起作用。我可以明确地写出AllArgsConstructor,但这(有点)在某种程度上击败了Lombok的目的。不是一个可怕的解决方案,但并不理想。

任何人都可以想到这方面的任何解决方法?

+0

您是否尝试更改AccessType。尝试在类 – pvpkiran

+0

上使用'@AccessType(AccessTpe.FIELD)',我看不出如何工作。 AccessType是关于数据层如何获得要被持久化的值,对吧?直接通过现场或通过访问器。此外,默认情况下已经是字段访问,所以这不会是一个变化,我不认为。 –

回答

0

我知道你可以使用非lombok默认值指定默认值。我没有尝试过这个特例,但它值得一试。

@Value(“#{道具[‘my.property’]:12345}”)

也许你应该尝试使用RequiredArgs构造只指定使用“每一个参数的构造最终/非-null字段“,并且不会覆盖var。

https://projectlombok.org/features/constructor

+0

无论如何,Builder注解都需要一个AllArgsConstructor。而且Spring似乎渴望选择任何其他版本的all-args版本。 哪个值注释是?龙目岛不能适用于一个财产,我不认为春天在这里会有任何好处。它会将默认值设置为在设计时不知道的值,但不会覆盖all-args构造函数的行为。 –

0

我能解决这个在我的模型类使用PrePersist注解。通过PrePersist,我可以确保无论设置为null还是由谁设置null值,都可以设置其默认值。这不是一个真正的解决方案,但是我应该可以做些什么,所以这是一个可以接受的解决方法。