下面是我的类:
public class DeduplicationErrorMetric extends AbstractErrorMetric {
public static final String DEDUPLICATIONS_METRIC = "deduplications";
public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
private static String DEDUPLICATION_TOPIC_NAME;
private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
private static final List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", DEDUPLICATION_TOPIC_NAME),
Tag.of("action", "send"), Tag.of("result", "failure"));
public DeduplicationErrorMetric() {
super(Map.of(
DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
));
}
@Override
public void incrementMetric(String key) {
errorCounters.get(key).increment();
}
}我的application.yml中有@Value("${kafka.topic.deduplication}"),需要在创建bean之前将值插入到DEDUPLICATION_TOPIC_NAME中。我该怎么做呢?
发布于 2021-04-09 03:37:02
您可以使用setter来完成此操作,但我主张使用来反对这种做法,!
null static字段为final,因此可能导致修改,从而导致难以调试的错误KAFKA_ERROR_TAGS使用null值
@Value("${kafka.topic.deduplication}")
private void setDeduplicationTopicName(String deduplicationTopicName) {
this.DEDUPLICATION_TOPIC_NAME = deducplicationTopicName;
}相反,可以尝试创建一个@Singleton bean并在其字段上使用@Value,这样就可以确保只有一个实例。
对于您的列表,您可以使用@PostConstruct来确保它被实例化一次
发布于 2021-04-09 05:59:43
在这里,您可以直接使用属性文件中的注入。
如果它是一个SpringBoot应用程序,在你的应用程序属性中设置你的kafka.topic.deduplication属性(你可以根据不同的环境设置不同的值)。
这样,Spring将在构造bean时获得该值。
您的代码可能如下所示:
public class DeduplicationErrorMetric extends AbstractErrorMetric {
public static final String DEDUPLICATIONS_METRIC = "deduplications";
public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
private static final List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", deduplicationTopicName),
Tag.of("action", "send"), Tag.of("result", "failure"));
@Value("${kafka.topic.deduplication}")
private String deduplicationTopicName;
public DeduplicationErrorMetric() {
super(Map.of(
DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
));
}
@Override
public void incrementMetric(String key) {
errorCounters.get(key).increment();
}
}发布于 2021-04-09 03:32:28
移除关键字"static“,然后您就可以在实例中更改它。
静态表示字段已锁定到类。
public class DeduplicationErrorMetric extends AbstractErrorMetric {
public static final String DEDUPLICATIONS_METRIC = "deduplications";
public static final String KAFKA_MESSAGES_METRIC = "kafka.messages";
private String DEDUPLICATION_TOPIC_NAME;
private static final List<Tag> DEDUPLICATION_ERROR_TAGS = List.of(Tag.of("type", "failed"));
private List<Tag> KAFKA_ERROR_TAGS = List.of(Tag.of("topic", DEDUPLICATION_TOPIC_NAME),
Tag.of("action", "send"), Tag.of("result", "failure"));
public DeduplicationErrorMetric() {
super(Map.of(
DEDUPLICATIONS_METRIC, DEDUPLICATION_ERROR_TAGS,
KAFKA_MESSAGES_METRIC, KAFKA_ERROR_TAGS
));
}
@Override
public void incrementMetric(String key) {
errorCounters.get(key).increment();
}
public void setTopic(String value){
DEDUPLICATION_TOPIC_NAME = value;
}
}
private void example(){
DeduplicationErrorMetric dem = new DeduplicationErrorMetric();
//Set the instance value directly
dem.DEDUPLICATION_TOPIC_NAME = "Test";
//Set via a function, potentially with other variables.
demo.setTopic("Test");
}我还建议将变量名设置为小写,因为它不是静态的,这是很好的编码实践。
https://stackoverflow.com/questions/67010567
复制相似问题