使用spring在java库中进行依赖注入

q3aa0525  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(228)

我是spring框架的新手,并试图在我的独立java库中使用spring框架进行依赖注入,该库由2个客户端使用
我正在声明我的bean,我想注入ObjectMapper

package com.my.package.search.modules

    @Component
    public class ModuleProvider {
        @Bean
        public ObjectMapper getObjectMapper() {
           return new ObjectMapper().enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
        }
    
    }

我的班级使用它

@Slf4j
    @ComponentScan(basePackages = {"com.my.package.search"})
    @Component
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    public class ConfigurationProcessor {
    
    private ObjectMapper objectMapper;
    
    @SneakyThrows
    public void processTheme(String name) {
    
        String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
        Car car = objectMapper.readValue(json, Car.class);
        System.out.println("all gg" + car);
    }
}

我正试着从

@Slf4j
public final class SomeCaller {

  //Some caller method is triggering this
    public void callConfig() {
        new ConfigurationProcessor().processTheme(null);
    }
}

我得到空指针异常

Car car = objectMapper.readValue(json, Car.class);

objectMapper -没有被注入,并且它是空的
我试着按照我从互联网上得到的例子,如https://www.baeldung.com/spring-component-annotation
PS:我知道这不是在库中集成DI的最佳实践。在这种情况下,两个客户端服务都是我自己拥有的。
编辑:1
我按照建议做了一些改变,但没有奏效

@Component
@Configuration
public class ModuleProvider {
    @Bean
    public ObjectMapper getObjectMapper() {
       return new ObjectMapper().enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
    }

}
oprakyz7

oprakyz71#

您需要使用配置为ObjectMapper创建配置。

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ObjectMapperConfig {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
}

然后在配置处理器类中自动连接对象Map器。

private final ObjectMapper objectMapper;

@Autowired
public ConfigurationProcessor(ObjectMapper objectMapper) {
    this.objectMapper = objectMapper;
}

这应该会将objectMapper对象注入到上下文中。

iszxjhcz

iszxjhcz2#

根据您提供的代码,似乎您正在TestSpring类中使用new关键字手动创建ConfigurationProcessor的示例。当您以这种方式创建一个对象时,Spring并不知道它,因此,它不会对该对象执行依赖注入。
要解决这个问题,一个解决方案是检索ConfigurationProcessor bean,并让spring处理依赖注入。这里有一个例子。

@Slf4j
@ComponentScan(basePackages = {"com.my.package.search"})
public final class TestSpring {
  
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(TestSpring.class);
        ConfigurationProcessor configurationProcessor = context.getBean(ConfigurationProcessor.class);
        configurationProcessor.processTheme(null);
    }
}

还有其他的解决方案。你可以试着看看哪一个最适合你的情况。这里有一些关键词:SpringBootTest、TestConfiguration或Mockito。

相关问题