@validated annotation使@configurationproperties类的字段为空

tjrkku2a  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(359)

我有以下两个类和yaml配置:
第1类:

@ConfigurationProperties
 @Validated     ֎ 1 ֎
 public class SplitterProps {

    @Valid
    public final ConnectionParams connectionParams;
 //   @Valid
 //   @NotNull
    public final Subscriber subscriber;
    public final List<@NotNull @Valid Converter> converters;

    @ConstructorBinding
    public SplitterProps(ConnectionParams connectionParams,
                                Map<String, Subscriber> subscribersList,
                                List<Converter> converters) {
        this.connectionParams = connectionParams;
        this.subscriber = subscribersList.isEmpty() ? 
                          null : 
                          subscribersList.values().iterator().next();
        this.converters = converters;
    }
 ...
 }

yaml配置:

...
subscribersList:
  sub1:
    kafkaBroker: xxx:9092
    topicName: saveTopic
    healthCheckTimeout: 10
    producerTimeout: 10
...

第2类:

@Configuration(proxyBeanMethods = false)
public class KafkaConfig {

    private final Subscriber subscriberProps;
    private final Map<String, Object> producerProps;

    public KafkaConfig(KafkaProperties kafkaProps,
                       SplitterProps appProps) {
        this.subscriberProps = appProps.subscriber;      ֎ 2 ֎
        this.producerProps = getProducerProperties(kafkaProps, subscriberProps);
    }
...
}

如果行中有@validated注解֎ 1֎
则appprops.subscriber==第行为空֎ 2֎. (npe(产生)
如果行中没有@validated注解֎ 1֎
然后appprops.subscriber!=行中为空֎ 2֎. (按预期工作)
为什么会这样?如何避免?

6ovsh4lw

6ovsh4lw1#

解决方案如下:
当@configurationproperties类上没有@validate注解时,则调用appprops.subscriber引用spliterProps类的示例。
当@configurationproperties类上有@validate注解时,splitterpops会 Package 到spring代理中,这样调用appprops.subscriber就引用代理成员。
要处理这种行为,我应该通过getter执行字段访问。
因此,我将@getter添加到spliterOps类中,现在是appprops.getsubscriber()!=无效的。

相关问题