Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何访问全局spring ObjectMapper?_Spring_Spring Boot_Jackson - Fatal编程技术网

如何访问全局spring ObjectMapper?

如何访问全局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();

我正在开发一个spring启动应用程序。我有下面的实用程序类,它将字符串转换为Json对象


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)。谢谢你的帮助!