如何访问全局spring ObjectMapper?
我正在开发一个spring启动应用程序。我有下面的实用程序类,它将字符串转换为Json对象如何访问全局spring ObjectMapper?,spring,spring-boot,jackson,Spring,Spring Boot,Jackson,我正在开发一个spring启动应用程序。我有下面的实用程序类,它将字符串转换为Json对象 public class JsonParser { private static ObjectMapper objMapper; private static ObjectMapper getMapper() { if (objMapper == null) { objMapper = new ObjectMapper();
public class JsonParser {
private static ObjectMapper objMapper;
private static ObjectMapper getMapper() {
if (objMapper == null) {
objMapper = new ObjectMapper();
}
return objMapper;
}
public static <K> K fromJsonToObj(String json, Class<K> kClass) throws IOException {
return mapper.readValue(json, kClass);
}
}
但我被告知上述方法不是一个很好的做法
Jackson Objectmapper的最佳实践建议在应用程序中只创建一个映射器实例。spring的一部分使用jackson对附加到请求的请求体进行反序列化,因此它已经有了一个请求体。为了遵循Jackson的最佳实践,spring将ObjectMapper作为bean公开,以便可以在其他位置访问它。我们希望使用此对象映射器,而不是创建自己的对象映射器。这还允许我们配置单个对象映射器,而不是配置多个对象映射器,以防我们需要在基本对象映射器上进行其他配置
因此,如果我们在静态utils类中确实需要objectMapper,我们应该将objectMapper作为参数传入服务层或其他任何地方,我们可以使用:
@Autowired
private ObjectMapper objectMapper;
获取全局spring对象映射器
但我不确定如何实施上述建议的方法。
有人能说明什么是正确的方法吗?我需要提供任何配置。您只需要让spring像这样自动连线
@Service
public class YourService {
public YourService(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
}
@Component
public class MapperComponent {
public MapperComponent(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
public static <K> K fromJsonToObj(String json, Class<K> kClass) throws IOException {
return objectMapper.readValue(json, kClass);
}
}
@Service
public class YourService {
private MapperComponent mapperComponent
public YourService(MapperComponent mapperComponent) {
this.mapperComponent = mapperComponent;
}
}
然后,当SpringBoot找到该类时,它将从中创建一个Springbean,并将ObjectMapper注入构造函数中的服务
当spring boot扫描并找到您的组件时,默认情况下它只会添加到上下文中一次。所以你会得到你想要的。我建议。这样,您就可以创建自己的映射器组件,而不是自己创建一个单例类
@Service
public class YourService {
public YourService(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
}
@Component
public class MapperComponent {
public MapperComponent(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
public static <K> K fromJsonToObj(String json, Class<K> kClass) throws IOException {
return objectMapper.readValue(json, kClass);
}
}
@Service
public class YourService {
private MapperComponent mapperComponent
public YourService(MapperComponent mapperComponent) {
this.mapperComponent = mapperComponent;
}
}
您无法以尝试的方式从单例从spring上下文访问objectmapper。但是您是对的,您可以在每次调用时将其交给singleton,但是当您可以自动连接组件时,您真的需要一个静态类吗?以及最佳实践-不使用@autowiredwithclass字段。更好的方法是通过构造函数使用依赖项注入(DI)。谢谢你的帮助!