【发布时间】:2021-02-26 19:44:32
【问题描述】:
我有一个创建对象的工厂类。就我而言,这是 ObjectMapper (Jackson)。
@Factory
public class JacksonFactory {
@Singleton
public ObjectMapper getObjectMapper() {
return new ObjectMapper().configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
}
}
我想将它注入到类的静态字段中:
public class JsonString {
@Inject
private static ObjectMapper mapper;
public static String of(Object object) {
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException exception) {
throw new RuntimeException();
}
}
}
但是,它不是那样工作的。每次访问映射器静态字段时,我都会得到一个 NullPointer。如果我将方法和字段设为非静态,一切都会正常运行。
我在文档中没有找到对此的解释,可能是我遗漏了什么或者依赖注入有什么问题?
非常感谢您的帮助! :)
更新
好的,伙计们。我不是在创建静态类,而是在创建一个对象,并且我想将它作为依赖项注入到将要创建的所有对象中。为什么我创建JsonDto对象的继承者时没有注入依赖?
@Singleton
public class JsonString {
@Inject
private ObjectMapper mapper;
public String of(Object object) {
try {
return mapper.writeValueAsString(this);
} catch (JsonProcessingException exception) {
throw new KyivAirException(exception);
}
}
}
我以为每次创建对象时,Micronaut 都会在上下文中找到这个 bin 并替换它。但这似乎不是它的工作方式。 我完全糊涂了-_\
public abstract class JsonDto {
@Inject
private JsonString jsonString;
@Override
public String toString() {
return jsonString.of(this);
}
}
【问题讨论】:
-
不要使用静态;这就是依赖注入的全部意义所在。使映射器(或包含它的其他服务类)成为任何需要它的构造函数参数。
-
@chrylis-cautiouslyoptimistic- 谢谢你的回答,是的,我明白你在说什么。但在这种情况下,我不想注入依赖项。我想将样板逻辑移动到静态 util 类中,并根据需要使用它。虽然这可能是一个圣战声明:)
-
为你的“样板”使用一个单例类,并在需要的地方注入它,这就是依赖注入的目的+
-
@IEE1394 感谢您的回答,我试过了,但它不起作用 - NPE。我已经更新了帖子。
标签: java dependency-injection static micronaut