web-dev-qa-db-ja.com

Spring Bootの@Valueはnullを返します

リソースにあるapplication.propertiesがあります。

apllication.properties

hsm.provider=software
hsm.name=TestHsm
hsm.port=3001
hsm.ip=127.0.0.1
hsm.timeout=10000

およびController

@RestController
@RequestMapping("/hsm")
public class Controller {

  @Value("${hsm.ip}")
  private String ip;

  @Value("${hsm.port}")
  private String port;

  @Value("${hsm.name}")
  private String name;

  @Value("${hsm.timeout}")
  private String timeout;

  @Value("${hsm.provider}")
  private String provider;}
}

ただし、アプリケーションを実行すると、すべての変数がNULLのままです。何が欠けていますか?

[〜#〜] edit [〜#〜]これはsrcフォルダーのプロジェクト構造です

src
├───main
│   ├───Java
│   │   └───com
│   │       └───xyz
│   │           └───hsmservice
│   │               └───hsm
│   │                   └───api
│   │                           Application.Java
│   │                           Controller.Java
│   │                           HSM.Java
│   │
│   └───resources
│       │   application.properties
│       │
│       └───META-INF
│               plugin.xml
│
└───test
    ├───Java
    │       LibraryTest.Java
    │
    └───resources

編集2これがアプリケーションクラスです

@SpringBootApplication
public class Application {  
    public static void main(String[] args) {
       SpringApplication.run(Application.class, args);
    }
}
4
NicO

さて、私は this 質問のトップアンサーでそれを解決しました。変数と@Valuesは、クラス変数としてではなく、コンストラクターのシグニチャーに入れます。

0
NicO

パッケージ構造から判断すると、これらのプロパティは確実に読み込まれるはずです。唯一可能なオプションは、Controllerクラスをnew Controller()としてインスタンス化したことであり、(@Autowiredまたはコンストラクター注入)。

2
Urosh T.

私はあなたのコードをSpringブートプロジェクトに追加しましたが、正常に動作しています。

この 534826 リポジトリをチェックアウトし、指示に従ってそれを起動して実行します。

また、コードをこのアプリケーションと比較して、問題が何であるかを理解してください。

それでも問題が解決しない場合は、こちらに投稿してください。

1
snmaddula

Controller.Java

ロンボクと

_package com.example.demo;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hsm")
@Data
public class Controller {
    @Value("${hsm.ip}")
    private String ip;

    @Value("${hsm.port}")
    private String port;

    @Value("${hsm.name}")
    private String name;

    @Value("${hsm.timeout}")
    private String timeout;

    @Value("${hsm.provider}")
    private String provider;
}
_

ロンボクなし(Intellijiによって生成-DeLombokのリファクタリング)

_    package com.example.demo;

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    @RequestMapping("/hsm")
    public class Controller {
        @Value("${hsm.ip}")
        private String ip;

        @Value("${hsm.port}")
        private String port;

        @Value("${hsm.name}")
        private String name;

        @Value("${hsm.timeout}")
        private String timeout;

        @Value("${hsm.provider}")
        private String provider;

        public Controller() {
        }

        public String getIp() {
            return this.ip;
        }

        public String getPort() {
            return this.port;
        }

        public String getName() {
            return this.name;
        }

        public String getTimeout() {
            return this.timeout;
        }

        public String getProvider() {
            return this.provider;
        }

        public void setIp(String ip) {
            this.ip = ip;
        }

        public void setPort(String port) {
            this.port = port;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setTimeout(String timeout) {
            this.timeout = timeout;
        }

        public void setProvider(String provider) {
            this.provider = provider;
        }

        public boolean equals(final Object o) {
            if (o == this) return true;
            if (!(o instanceof Controller)) return false;
            final Controller other = (Controller) o;
            if (!other.canEqual((Object) this)) return false;
            final Object this$ip = this.getIp();
            final Object other$ip = other.getIp();
            if (this$ip == null ? other$ip != null : !this$ip.equals(other$ip)) return false;
            final Object this$port = this.getPort();
            final Object other$port = other.getPort();
            if (this$port == null ? other$port != null : !this$port.equals(other$port)) return false;
            final Object this$name = this.getName();
            final Object other$name = other.getName();
            if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
            final Object this$timeout = this.getTimeout();
            final Object other$timeout = other.getTimeout();
            if (this$timeout == null ? other$timeout != null : !this$timeout.equals(other$timeout)) return false;
            final Object this$provider = this.getProvider();
            final Object other$provider = other.getProvider();
            if (this$provider == null ? other$provider != null : !this$provider.equals(other$provider)) return false;
            return true;
        }

        protected boolean canEqual(final Object other) {
            return other instanceof Controller;
        }

        public int hashCode() {
            final int PRIME = 59;
            int result = 1;
            final Object $ip = this.getIp();
            result = result * PRIME + ($ip == null ? 43 : $ip.hashCode());
            final Object $port = this.getPort();
            result = result * PRIME + ($port == null ? 43 : $port.hashCode());
            final Object $name = this.getName();
            result = result * PRIME + ($name == null ? 43 : $name.hashCode());
            final Object $timeout = this.getTimeout();
            result = result * PRIME + ($timeout == null ? 43 : $timeout.hashCode());
            final Object $provider = this.getProvider();
            result = result * PRIME + ($provider == null ? 43 : $provider.hashCode());
            return result;
        }

        public String toString() {
            return "Controller(ip=" + this.getIp() + ", port=" + this.getPort() + ", name=" + this.getName() + ", timeout=" + this.getTimeout() + ", provider=" + this.getProvider() + ")";
        }
    }
_

DemoApplication.Java

_package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

@SpringBootApplication
public class DemoApplication {
    @Autowired
    Controller controller;

    public static void main(String[] args) {
        try (ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class, args)) {
            DemoApplication app = ctx.getBean(DemoApplication.class);
            app.run(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void run(String... args) throws Exception {
        System.out.println(controller);
    }
}
_

出力:Controller(ip=127.0.0.1, port=3001, name=TestHsm, timeout=1000, provider=software)

0
VietDD

以前同じ問題があり、@ Valueはコントローラーでは機能せず、コンポーネントクラスで機能していたため、以下の解決策を使用しました。

_@Autowire Environment environment_してからenvironment.getProperty("hsm.provider")を実行できます。

注:これは回避策にすぎません。

0
Alien