JavaBeanExecutable HV000254缺少Java枚举的参数元数据

问题描述

我将Spring Boot应用程序从1.5升级到了2.3.5。当Spring Boot应用程序启动时,我收到以下4次警告:

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

我的FacetField枚举看起来像这样:

public enum FacetField {

    CONST_1("KEY","ESFIELD","RESOURCEKEY"),CONST_2("KEY",CONST_3("KEY",""),CONST_4("KEY","ESMAXFIELD","RESOURCEKEY",Hours.class),CONST_5("KEY",Experience.class),CONST_6("KEY","",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 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 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,FROM_5_TO_10(5d,FROM_10(10d,null,"10+");

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

        Experience(final Double min,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,"40");

        private final Double min;
        private final Double max;
        private final String selectableDescription;
        
        Hours(final Double min,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上的这个graal问题:https://github.com/oracle/graal/issues/1941

有人可以解释吗?

解决方法

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>