Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用占位符创建自定义注释?_Java_Parsing_Annotations_Placeholder - Fatal编程技术网

Java 使用占位符创建自定义注释?

Java 使用占位符创建自定义注释?,java,parsing,annotations,placeholder,Java,Parsing,Annotations,Placeholder,我正在创建一些自定义注释。我需要创建一个带有“占位符”的人,因为它在春季使用 @Value("#{aParameter}") 或者在JSF2中 @ManagedProperty(value="#{aParameter}") 我想我必须在某个地方有一个映射(.properties或.xml文件或enum类),但我需要知道如何在自定义注释接口中编写这种方法。我的意思是如何在注释界面中声明占位符?在某处应用注释时,如何确保赋值(在映射文件中) 提前感谢。您不在注释声明中这样做,而是在使用该注释的代

我正在创建一些自定义注释。我需要创建一个带有“占位符”的人,因为它在春季使用

@Value("#{aParameter}")
或者在JSF2中

@ManagedProperty(value="#{aParameter}")
我想我必须在某个地方有一个映射(.properties或.xml文件或enum类),但我需要知道如何在自定义注释接口中编写这种方法。我的意思是如何在注释界面中声明占位符?在某处应用注释时,如何确保赋值(在映射文件中)


提前感谢。

您不在注释声明中这样做,而是在使用该注释的代码中这样做

例如,
@Value
声明如下:

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

    /**
    * The actual value expression: e.g. "#{systemProperties.myProp}".
    */
    String 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);
}
如果您跟踪它的使用方式,您将在
org.springframework.web.bind.annotation.support.HandlerMethodInvoker
类中看到,该值直接从注释
defaultValue=((value)paramAnn).value()获取然后按如下方式解析:

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

    /**
    * The actual value expression: e.g. "#{systemProperties.myProp}".
    */
    String 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);
}
因此,负责解析属性的逻辑被放在类中 实际上使用了read注释并使其有用