0

カスタム注釈をいくつか作成しています。Springで使用されているように、「プレースホルダー」を持つ誰かを作成する必要があります

@Value("#{aParameter}")

またはJSF 2で

@ManagedProperty(value="#{aParameter}")

どこかにマッピング (.properties または .xml ファイルまたは enum クラス) が必要だと思いますが、カスタム注釈インターフェイスでこのアプローチをコーディングすることを知る必要があります。注釈インターフェースでプレースホルダーを宣言する方法を意味しますか? 注釈をどこかに適用するときに、その値の割り当てを (マッピングファイルで) 確実にする方法は?

前もって感謝します。

4

1 に答える 1

1

注釈宣言では行いません。その注釈を使用するコードで行います。

たとえば、@Valueは次のように宣言されます。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
public @interface Value {

    /**
    * The actual value expression: e.g. "#{systemProperties.myProp}".
    */
    String value();
} 

org.springframework.web.bind.annotation.support.HandlerMethodInvokerそれがどのように使用されているかを追跡すると、クラスで値がアノテーションから直接フェッチされ、次のdefaultValue = ((Value) paramAnn).value();ように解決されることがわかります。

if (defaultValue != null) {
    args[i] = resolveDefaultValue(defaultValue);
}

...
class AnnotationMethodHandlerAdapter{
...
protected Object resolveDefaultValue(String value) {
    if (beanFactory == null) {
        return value;
    }    
    String placeholdersResolved = beanFactory.resolveEmbeddedValue(value);
    BeanExpressionResolver exprResolver = beanFactory.getBeanExpressionResolver();
    if (exprResolver == null) {
        return value;
    }
    return exprResolver.evaluate(placeholdersResolved, expressionContext);
}

そのため、プロパティの解決などを処理するロジックは、読み取り注釈を実際に使用して有用にするクラスに配置されます。

于 2013-05-17T16:41:48.803 に答える