我有以下两个类和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֎. (按预期工作)
为什么会这样?如何避免?
1条答案
按热度按时间6ovsh4lw1#
解决方案如下:
当@configurationproperties类上没有@validate注解时,则调用appprops.subscriber引用spliterProps类的示例。
当@configurationproperties类上有@validate注解时,splitterpops会 Package 到spring代理中,这样调用appprops.subscriber就引用代理成员。
要处理这种行为,我应该通过getter执行字段访问。
因此,我将@getter添加到spliterOps类中,现在是appprops.getsubscriber()!=无效的。