如何解决如何在 micronaut 2 中注入静态场?
我有一个创建对象的工厂类。就我而言,这是 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);
}
}
解决方法
我建议尝试这样的事情:
首先创建您的对象转换器,它将转换对象
@Singleton
public class ObjectConverter (private ObjectMapper mapper) {
public String of(Object object) {
try {
return mapper.writeValueAsString(this);
} catch (JsonProcessingException exception) {
throw new RuntimeException(exception);
}
}
}
让你的 dto 像那样(我更喜欢构造函数注入而不是 @inject)
public abstract class MyDto(private ObjectConverter converter) {
@Override
public String toString() {
return converter.of(this);
}
}
最后是你的服务,照顾 dtos
@Singleton
public class MyDtoService(private ObjectConverter mapper) {
public String get(Long id) {
// TODO get the object from somewhere
return mapper.of(dto)
}
}
如果我们谈论的是来自数据库的 dto,我建议类似这样的东西
interface MyJsonDbDto {
String decode(ObjectConverter mapper) {
return mapper.of(this)
}
}
public class MyDbDto implements MyJsonDbDto{
}
和服务
public class MyDbDtoService(private ObjectConverter converter,private MyDbDtoRepository repository)
public String get(Long id) {
// TODO get the object from repository
return dto.decode(converter)
}
}
希望有所帮助,抱歉我主要使用 kotlin,因此我的 java 有点生疏;-)
编辑:
关于您的评论,我有一个丑陋的想法,可以将其视为重构过程的某种中间解决方案
创建这样的服务(使用上下文,使其不像单例那样延迟加载)
@Context
public class MyDtoService {
public static ObjectConverter mapper;
public MyDtoService(ObjectConverter mapper) {
MyDtoService.mapper = mapper;
}
}
之后你可以在你的 dto 中访问它
public class MyDto {
@Override
public String toString() {
return MyDtoService.mapper.of(this);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。