java - 自动连线,值注释不起作用

标签 java spring-boot postconstruct

我正在使用下面的类,并且我的 @Autowired、@Value 注释不适用于 Spring Boot 应用程序。另外,我将 init 方法与 @PostConstruct 结合使用,并在应用程序启动时初始化该值。然后在使用变量之前,该值被初始化为 0 或 null。

这是我的代码:

@Component
public class OsmXmlClient {
    
    private static final Logger log = 
    LoggerFactory.getLogger(OsmXmlClient.class);

    /*@Value("${osm.xml.service.url}") */
    private String osmXmlServiceUrl = "http://myurl/XMLAPI";
    /*#@Value("${osm.xml.service.userId}") */
    private String osmXmlServiceUserId = "abc";
    /*@Value("${osm.xml.service.password}")*/
    private String osmXmlServicePassword = "abc123";
    
    private Map<Integer, String> urlMap = new HashMap<>();
    private Random random = new Random();
    private int seviceUrlsCount = 0;
    
    
    @PostConstruct
    public void init() {
        List<String> servieUrlList = Arrays.asList(osmXmlServiceUrl.split(";"));
        log.info("servieUrlList = " + servieUrlList);
        seviceUrlsCount = servieUrlList.size();
        log.info("seviceUrlsCount in init = " + seviceUrlsCount);
        
        for(int i=0;i<seviceUrlsCount;i++) {
            log.info("servieUrlList.get(i) = " + servieUrlList.get(i));
            urlMap.put(i, servieUrlList.get(i));
        }
    } 
    
    private String getServiceUrl() {
        log.info("serviceUrlsCount  at getServiceUrl = " + seviceUrlsCount);
        return urlMap.get(random.nextInt(seviceUrlsCount));
    }
}

这是日志:

[2020-07-31 17:07:30.373] [INFO] [Context:TomcatWebServer] [] [Tomcat initialized with port(s): 9014 (http)]
[2020-07-31 17:07:30.903] [DEBUG] [Context:OsmModuleApplication] [] [osmProperties = OsmProperties()]
[2020-07-31 17:07:30.920] [INFO] [Context:OsmXmlClient] [] [servieUrlList = [http://myurl/XMLAPI]]
[2020-07-31 17:07:30.921] [INFO] [Context:OsmXmlClient] [] [seviceUrlsCount in init = 1]
[2020-07-31 17:07:30.921] [INFO] [Context:OsmXmlClient] [] [servieUrlList.get(i) = http://myurl/XMLAPI]
[2020-07-31 17:07:31.041] [INFO] [Context:OrderController] [] [OrderControllerInit called]

然后我得到了这个日志:

[2020-07-31 17:07:45.403] [INFO] [Context:OrderDetailsService] [] [Entering 
retryOrderService with billerorderId = 22428040]
[2020-07-31 17:07:45.403] [INFO] [Context:OsmXmlClient] [] [serviceUrlsCount  at getServiceUrl = 0]
[2020-

我之前遇到过 @Autowired 和 @Value 注解问题。但我有一个解决方法。我想知道为什么会发生这种情况以及解决方案是什么。

这是我调用 OsmXmlClient 类的服务类:

@Service
public class OrderDetailsService {

    private static final Logger log = 
    LoggerFactory.getLogger(OrderDetailsService.class);

    OSMClient osmClient = new OSMClient();
    OsmXmlClient osmXmlClient = new OsmXmlClient();
    OSMProvAdService provAdService = new OSMProvAdService();
    CommonService commonService = new CommonService();

    public RetryOrderResponseType retryOrderService(String orderId) {
        log.info("Entering retryOrderService with billerorderId = " + orderId);
    
        String billerOrderId = "";
    
        String orderProcessHistory = osmXmlClient.queryOrder(orderId);
        log.info("orderProcessHistory = " + orderProcessHistory);
    
        RetryOrderResponseType retryOrderResponse = null;
        List<GetOrderResponseType> orderResponseTypes = new ArrayList<>();
        FindOrderResponseType findOrderResponseType = null;
    
        return retryOrderResponse;
    }
}

如您所见,我必须使用 new 关键字而不是 Autowiring 来实例化。

最佳答案

除非组件由 Spring 初始化,否则 @Value 属性不会由 Spring 初始化。如果您希望依赖项注入(inject)、属性注入(inject)等工作正常工作,请不要自己使用 new 实例化类。相反,使用 @Autowired 来提供 Component 的实例。

关于java - 自动连线,值注释不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63200205/

相关文章:

java - 保持 LinkedList 始终排序

java - 计算除法的数量,直到总和 == 0

java - 为 Java Spring Boot Gradle 项目构建 Heroku Procfile

dependency-injection - 为什么我不能在 Managed Bean 构造函数中使用 Init 属性?

java - 如何在测试期间在 Spring 中禁用 @PostConstruct

java - 如何使用 Apache Calcite 将数据插入 Excel 表?

java - 在实际应用程序中使用模拟对象(未测试)

java - 当部署到 Eclipse 中的 Tomcat 时,Spring Boot 应用程序不会启动

java - 在启动 spring boot 服务之前等待依赖项加载

Java多态基础