簡體   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