2016-10-26 14 views
1

私は見つけることができるすべてについて何かを読んだのですが、何らかの理由でこの作業をどうやって行うかについて私の頭脳を包み込むことはできません。 2日間、既存のプロジェクトで苦労した後、私はメインフォルダ内のリソースフォルダを作成し、以下でapplication.propertiesと呼ばれるファイルを追加Spring.io@Valueアノテーションを使用したSpringブートapplication.propertiesへのアクセス

https://spring.io/guides/gs/rest-service/

から残りのコンテンツはじめにダウンロード次のよう

my.setting = HELLOTHERE 

Iは、次いで、グリーティングクラス修飾:

package hello; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.autoconfigure.domain.EntityScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.stereotype.Component; 

@Component 
public class Greeting { 

    private long id; 
    private String content; 
    private String dooDad; 
    public Greeting(long id, String content) { 
     this.id = id; 
     this.content = content; 
    } 

    public Greeting() { 
     // TODO Auto-generated constructor stub 
    } 

    public long getId() { 
     return id; 
    } 

    public String getContent() { 
     return content; 
    } 

    public String getDooDad() { 
     return dooDad; 
    } 
    @Autowired 
    public void setDooDad(@Value("${my.setting}")String dooDad) { 
     this.dooDad = dooDad; 
    } 
} 

私はAPPL修飾しました

package hello; 

import java.util.concurrent.atomic.AtomicLong; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class GreetingController { 

    private static final String template = "Hello, %s!"; 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/greeting") 
    public Greeting greeting(@RequestParam(value="name", defaultValue="World") String name) { 
     return new Greeting(counter.incrementAndGet(), 
          String.format(template, name)); 
    } 
} 

私は、アプリケーションを実行し、出力を見てみると:私はGreetingControllerクラスを変更しなかったが、完全を期すために、それが含まれます

package hello; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Configuration; 

@SpringBootApplication 
@Configuration 
public class Application { 

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

を次のように@Configurationアノテーションを持っているicationクラス私はdooDadの値を見ることを期待しましたが、それは常にnullです。

{"id":1,"content":"Hello, mike!","dooDad":null} 

これを理解するための助けがあれば幸いです。私は@ValueアノテーションをApplicationクラスの変数に置くと、Greetingクラスに入っているときではなく、その変数に正しい値が設定されることを発見しましたか?

答えて

3

あなたがオブジェクトGreetingを自分でインスタンス化することにより、依存性注入をバイパスされています

return new Greeting(counter.incrementAndGet(), 
          String.format(template, name)); 

したがってGreetingオブジェクト内@Component@Value注釈が(この特定のインスタンスのために)何もしていません。

私は、次の操作を行ってお勧めします:

  1. グリーティングは、標準的なPOJO
  2. オブジェクトお使いのGreeting Controller
  3. String dooDadフィールドとして使用@Value("${my.setting}") String dooDad

  4. コンストラクタでインクルードパス dooDadへあなたの新しいGreetingオブジェクトは次のようになります:

    return new Gr eeting(counter.incrementAndGet()、 String.format(template、name)、dooDad);

更新は:OPで説明セットアップを実現するためのさまざまなオプションを説明するためにexample projectを追加しました。

+0

これはこの特定のケースでは理にかなっていますが、JSONを入力として受け入れるエンドポイントにデフォルト値を設定できるようにしたいと考えています。JSONは、この例ではオブジェクト全体を必ずしも含んでいるとは限りません。 '{" id ":0、" content ":" foo "}' '@Valueを使ってdooDadの値を設定するだけです'。エンドポイントでdooDadの値をテストし、nullの場合は '@ Value'に設定する必要がありますが、あなたが何を言っているのか理解していればいいですか?別の方法はありませんか? –

+0

@MichaelHatch絶対に。このシナリオでは、RequestMethodをPOSTに変更し、RequestParamのデフォルト値を設定します(これはnameパラメータで行ったとおりです)。これは最もクリーンなアプローチです。 dooDadの値が送信されない場合、デフォルト値が使用されます。ここで、プロパティファイル内からこのデフォルト値を設定しようとしているなら、もう少し詳しく説明しますが、それを行うことができます。詳細については、私のサンプルレポを参照してください。https://github.com/kanderson450/stackoverflow-q40271433マスターブランチは簡単なアプローチですが、特性ブランチでプロパティファイルのアプローチをチェックしてください。 –

関連する問題