gpt4 book ai didi

java - 注释从 Immutables 接口(interface)奇怪地传递到实现

转载 作者:行者123 更新时间:2023-12-02 01:54:39 25 4
gpt4 key购买 nike

我正在使用 Immutables 为该接口(interface)生成不可变:

import javax.validation.constraints.Size;
...

@Value.Immutable
public interface Entity {
@Size(max = 10) // removing this also works
String name();
}

但是生成的类字段对我来说看起来很奇怪:

private final java.lang.@Size(max = 10) 字符串名称;

请参阅 @Size 注释前面的 java.lang. 垃圾。有了它 - 验证无法按预期进行。

手动删除它 - 一切正常。这种行为的原因可能是什么?已检查2.5.4-2.5.6版本

最佳答案

自创建问题以来已有 2 年多了,但我无论如何都会回复,因为如果某人在自定义注释中遇到类似行为,它仍然可以帮助他们。在使用自定义注释和 Immutables 时,我遇到了类似的问题。

类定义:

@Value.Immutable
@JsonDeserialize(as = ImmutableMyClass.class)
public abstract class MyClass {

@MyCustomAnnotation
public abstract String getMyField();
...

生成的不可变类(注意添加“java.lang.”前缀):

@Immutable
@CheckReturnValue
public final class ImmutableMyClass extends MyClass {
private final java.lang.@MyCustomAnnotation String myField;
...

自定义注释定义:

@Documented
@Target({FIELD, PARAMETER, ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomAnnotationValidator.class)
public @interface MyCustomAnnotation {

String DEFAULT_MESSAGE = "Validation message...";
...

这导致“MyCustomAnnotation”根本不会被触发。

我的情况的问题是在“MyCustomAnnotation”中,ElementType.METHOD 丢失(因为我使用的是抽象方法 getter)。

@Documented
@Target({FIELD, **METHOD**, PARAMETER, ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomAnnotationValidator.class)
public @interface MyCustomAnnotation {

String DEFAULT_MESSAGE = "Validation message...";
...

添加 ElementType.METHOD 后,问题消失,验证按预期触发。

生成的不可变类:

@Immutable
@CheckReturnValue
public final class ImmutableMyClass extends MyClass {
private final @MyCustomAnnotation String myField;
...
<小时/>

对于其他情况(例如,当正确使用注释的 ElementType 时,我建议升级到依赖项的最新可能版本(目前 Immutables 为 2.8.2)。

关于java - 注释从 Immutables 接口(interface)奇怪地传递到实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com