報奨金にはあまり興味がありませんが、まだテーブルにある場合は受け取ります。これは、私が $DAYJOB で使用しているコードと非常によく似ています。これは理論ではなく、実稼働コードで使用するものですが、有罪を保護するために変更されています。変更したコードをコンパイルしようとはしていないので、名前の変更などでいくつかのエラーを犯した可能性があることに注意してください。ただし、ここに含まれる原則はすべてテストされ、機能しています。
まず、Value Holder Qualifier が必要です。@Nonbinding を使用して、同じ値を持つ修飾子のみに WELD が一致しないようにします。これは、この特定の修飾子のすべての値を単一の注入ポイントに一致させる必要があるためです。修飾子と値を同じアノテーションに保持することで、それらの 1 つを誤って「忘れる」ことはありません。(KISS原理)
@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface ConfigValue {
// Excludes this value from being considered for injection point matching
@Nonbinding
// Avoid specifying a default value, since it can encourage programmer error.
// We WANT a value every time.
String value();
}
次に、Map を取得する方法を知っているプロデューサー メソッドが必要です。おそらく、プロデューサー メソッドを保持する Named Bean が必要なので、getter/setter を使用して値を明示的に初期化するか、Bean に初期化させることができます。
コンパイル時のエラーを回避するために、プロデューサー メソッドの修飾子に空白の値を指定する必要がありますが、実際には使用されません。
@Named
public class ConfigProducer {
//@Inject // Initialize this parameter somehow
Map<String,String> configurationMap;
@PostConstructor
public void doInit() {
// TODO: Get the configuration map here if it needs explicit initialization
}
// In general, I would discourage using this method, since it can be difficult to control exactly the order in which beans initialize at runtime.
public void setConfigurationMap(Map<String,String> configurationMap) {
this.configurationMap = configurationMap;
}
@Produces
@ConfigValue("")
@Dependent
public String configValueProducer(InjectionPoint ip) {
// We know this annotation WILL be present as WELD won't call us otherwise, so no null checking is required.
ConfigValue configValue = ip.getAnnotated().getAnnotation(ConfigValue.class);
// This could potentially return a null, so the function is annotated @Dependent to avoid a WELD error.
return configurationMap.get(configValue.value());
}
}
使い方は簡単です:
@Inject
@ConfigValue("some.map.key.here")
String someConfigValue;