【问题标题】:JavaBeanExecutable HV000254 missing parameter metadata for Java EnumJavaBeanExecutable HV000254 缺少 Java Enum 的参数元数据
【发布时间】:2020-11-05 14:14:33
【问题描述】:

我将我的 spring boot 应用程序从 1.5 升级到了 2.3.5(使用 spring boot gradle 插件)。当 spring boot 应用程序启动时,我收到以下警告 4 次:

2020-11-05 13:29:19.432 警告 3931 --- [nio-8080-exec-4] o.h.v.i.p.javabean.JavaBeanExecutable:HV000254:缺少参数 FacetField 的元数据(字符串,整数,字符串,字符串,字符串,整数, Class),它声明隐式或合成参数。自动的 方法参数的泛型类型信息的解析可能会产生 如果多个参数具有相同的擦除,则结果不正确。到 解决这个问题,用'-parameters'标志编译你的代码。

我的 FacetField 枚举如下所示:

public enum FacetField {

    CONST_1("KEY", "ESFIELD", "RESOURCEKEY"),
    CONST_2("KEY", "ESFIELD", "RESOURCEKEY"),
    CONST_3("KEY", "ESFIELD", ""),

    CONST_4("KEY", "ESFIELD", "ESMAXFIELD", "RESOURCEKEY", Hours.class),
    CONST_5("KEY", "ESFIELD", "RESOURCEKEY", Experience.class),
    CONST_6("KEY", "ESFIELD", "", Distance.class);

    private String key;
    private String esField;
    private String esMaxField;
    private String resourcekey;
    private Class<? extends RangeFacet> rangeFacet;

    FacetField(final String key, final String esField, final String resourcekey) {
        this.key = key;
        this.esField = esField;
        this.resourcekey = resourcekey;
        this.rangeFacet = null;
    }

    FacetField(final String key, final String esField, final String resourcekey, final Class<? extends RangeFacet> rangeFacet) {
        this.key = key;
        this.esField = esField;
        this.resourcekey = resourcekey;
        this.rangeFacet = rangeFacet;
    }

    FacetField(final String key, final String esMinField, final String esMaxField, final String resourcekey, final Class<? extends RangeFacet> rangeFacet) {
        this.key = key;
        this.esField = esMinField;
        this.esMaxField = esMaxField;
        this.resourcekey = resourcekey;
        this.rangeFacet = rangeFacet;
    }


    public String getKey() {
        return key;
    }

    public String getEsField(final FieldProperty fieldProperty) {
        return esField + fieldProperty.getEsFieldProperty();
    }

    public String getEsMinField() {
        return esField;
    }

    public String getEsMaxField() {
        return esMaxField;
    }

    public String getResourcekey() {
        return resourcekey;
    }

    public enum Distance implements RangeFacet {

        FROM_0_TO_5(0d, 5d, "5"),
        FROM_0_TO_10(0d, 10d, "10"),
        FROM_0_TO_20(0d, 20d, "20"),
        FROM_0_TO_30(0d, 30d, "30"),
        FROM_0_TO_50(0d, 50d, "50");

        private final Double min;
        private final Double max;
        private final String selectableDescription;

        Distance(final Double min, final Double max, final String selectableDescription) {
            this.min = min;
            this.max = max;
            this.selectableDescription = selectableDescription;
        }

        @Override
        public Double getMin() {
            return this.min;
        }

        @Override
        public Double getMax() {
            return this.max;
        }

        @Override
        public String getSelectableDescription() {
            return this.selectableDescription;
        }
    }

    public enum Experience implements RangeFacet {

        TO_1(0d, 1d, "1"),
        FROM_1_TO_2(1d, 2d, "2"),
        FROM_2_TO_5(2d, 5d, "5"),
        FROM_5_TO_10(5d, 10d, "10"),
        FROM_10(10d, null, "10+");

        private final Double min;
        private final Double max;
        private final String selectableDescription;

        Experience(final Double min, final Double max, final String selectableDescription) {
            this.min = min;
            this.max = max;
            this.selectableDescription = selectableDescription;
        }

        @Override
        public Double getMin() {
            return this.min;
        }

        @Override
        public Double getMax() {
            return this.max;
        }

        @Override
        public String getSelectableDescription() {
            return this.selectableDescription;
        }
    }

    public enum Hours implements RangeFacet {

        FROM_0_TO_8(0d, 8d, "8"),
        FROM_9_TO_16(9d, 16d, "16"),
        FROM_17_TO_24(17d, 24d, "24"),
        FROM_25_TO_32(25d, 32d, "32"),
        FROM_33_TO_36(33d, 36d, "36"),
        FROM_37(37d, null, "40");

        private final Double min;
        private final Double max;
        private final String selectableDescription;
        
        Hours(final Double min, final Double max, final String selectableDescription) {
            this.min = min;
            this.max = max;
            this.selectableDescription = selectableDescription;
        }

        @Override
        public Double getMin() {
            return this.min;
        }

        @Override
        public Double getMax() {
            return this.max;
        }

        @Override
        public String getSelectableDescription() {
            return this.selectableDescription;
        }
    }

}

我唯一能找到与此相关的东西是 github 上的这个问题:https://github.com/oracle/graal/issues/1941

谁能解释一下?

【问题讨论】:

    标签: java spring spring-boot jvm graalvm


    【解决方案1】:

    spring-boot-parent 曾经在maven-compiler-plugin 中设置标志,直到2.2.x 版本。

    您必须自己将标志添加到maven-compiler-plugin

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <parameters>true</parameters>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    【讨论】:

    • 我用的是gradle插件,应该有同样的问题吧?
    • 有谁知道他们为什么删除了这个标志?另一个问题:添加所需的元数据而不是抑制警告会更好吗?
    • @MisterVanderbilt 从技术上讲,这并没有抑制警告。源不包含如何配对参数的信息,这将包括构建 jar 中的参数名称,因此可以使用此名称进行配对。但你是对的,这应该由图书馆的作者以不同的方式解决。
    【解决方案2】:

    另一个答案解释了如何通过在 Maven 中使用 -paramaters 标志进行编译来消除警告。使用 Spring Boot 2 你 don't need to do that anymore (无论是 Maven 还是 Gradle)。

    如果您仍然收到有关枚举常量的警告,那似乎是 a bug of Hibernate Validator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多