繁体   English   中英

值无法注入服务 class spring 启动

[英]Value cannot injected into service class spring boot

我已经尝试通过stackoverflow搜索,但我认为我找不到我想要的解决方案......

另外我尝试使用答案https://stackoverflow.com/questions/45970442/spring-boot-value-returning-null仍然无法正常工作...

这是我的 controller class

package com.vincent.springoauth.controller;
import com.vincent.springoauth.model.GiftCardRequest;
import com.vincent.springoauth.model.GiftCardResponse;
import com.vincent.springoauth.service.InCommGiftCardServiceImpl;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/gift-card")
public class GiftCardController{


    @PostMapping("/activate")
    public @ResponseBody
    GiftCardResponse activate(GiftCardRequest request) {
        GiftCardServiceImpl giftCardService = new GiftCardServiceImpl("");
        return giftCardService.activate(request);
    }
}

这是我的服务 class

package com.vincent.springoauth.service;

import com.vincent.springoauth.model.GiftCardRequest;
import com.vincent.springoauth.model.GiftCardResponse;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
@Log4j2
public class GiftCardServiceImpl {


    private final String baseEndpoint;

    public GiftCardServiceImpl( @Value("${webserviceurl}")String baseEndpoint){
        this.baseEndpoint = baseEndpoint;
    }



    public String accessToken() {
        log.info("Access oauth token url address: " + baseEndpoint);

        // will be use that base endpoint to manipulate stuff later
        return "abcdefg";

    }

    public GiftCardResponse activate(GiftCardRequest request) {

        log.info("Calling token ...");
        accessToken();
        log.info("Incomm Pre Auth Service");

        // Generate preAuth request;
        //RetailTransactionGenericRequestWrapper retailTransactionGenericRequest = buildRequest(request);
        //log.info("RetailTransactionGenericRequest: " + retailTransactionGenericRequest);
        GiftCardResponse response = GiftCardResponse.builder().responseCode("0").responseMessage("Success").build();
        return response;
    }
}

在我的application.properties我有以下行webserviceurl=https://localhost/giftcard

在我的服务 class 中, webserviceurl返回null的问题。 我怎样才能解决这个问题?

在您的 controller 中,您正在创建自己的服务实例,因此 Spring 不知道它并且无法注入该值。 您的服务 class 被注释为服务,因此 Spring 将创建一个实例,该实例将注入值,但这不是您的 controller 正在使用的实例。

相反,您应该将该服务声明为 controller 中的实例变量,并在该实例变量上使用 Autowire 注释或使用构造函数自动装配来确保 Spring 创建的 bean 是 Z594C103F2C6E04C3D8AZA 使用的那个。

@RestController
@RequestMapping("/api/gift-card")
public class GiftCardController{

    private GiftCardServiceImpl giftCardService;

    @Autowired
    public GiftCardController(GiftCardServiceImpl giftCardService) {
        this.giftCardService = giftCardService;
    }

@Value注释用于将值注入 Spring 管理的 bean 中的字段。 在您的示例中,您自己创建GiftCardServiceImpl并且 Spring 无法控制创建并从application.properties注入webserviceurl值。 您可以更改GiftCardController以允许 Spring 执行此操作。

package com.vincent.springoauth.controller;
import com.vincent.springoauth.model.GiftCardRequest;
import com.vincent.springoauth.model.GiftCardResponse;
import com.vincent.springoauth.service.InCommGiftCardServiceImpl;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/gift-card")
public class GiftCardController{
    private final GiftCardServiceImpl giftCardService;

    public GiftCardController(GiftCardServiceImpl giftCardService) {
        this.giftCardService = giftCardService;
    }

    @PostMapping("/activate")
    public @ResponseBody
    GiftCardResponse activate(GiftCardRequest request) {
        return giftCardService.activate(request);
    }
}

尝试通过 Spring DI 注入GiftCardServiceImpl ,如下例所示

package com.vincent.springoauth.controller;
import com.vincent.springoauth.model.GiftCardRequest;
import com.vincent.springoauth.model.GiftCardResponse;
import com.vincent.springoauth.service.InCommGiftCardServiceImpl;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/gift-card")
public class GiftCardController{

    @Autowired
    private GiftCardServiceImpl giftCardService;

    @PostMapping("/activate")
    public @ResponseBody
    GiftCardResponse activate(GiftCardRequest request) {
        return giftCardService.activate(request);
    }
}

当您通过简单的new关键字创建@Value时,@Value 注释仅适用于 Spring Bean。 Spring 没有发现应该在构造函数中注入属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM