通过注释注入Java字段



我正试图编写代码来注释类中的字段,以便从配置文件设置该字段的值。这实际上与spring框架具有的@Value属性相同,但由于我不打算详细说明的原因,我没有使用spring框架。

我正在工作的项目是一个使用泽西框架的web应用程序。我为前面的所有信息道歉,但为了完整性,这里是我所拥有的基本设置:

这是主应用程序类:

package com.ttrr.myservice;
import com.ttrr.myservice.controllers.MyController;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;
@ApplicationPath("/")
public class MyApplication extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> classes = new HashSet<Class<?>>();
        // register root resources            
        classes.add(MyController.class);
        return classes;
    }
}

这是MyController类,我想让注释在其中工作:

package com.ttrr.myservice.controllers;
import com.ttrr.myservice.annotations.Property;
import javax.servlet.ServletContext;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
@Path("test")
public class MyController {
    @Property("my.value.from.config")
    private String myValue;
    @GET
    @Produces("text/html")
    @Path("/testPage")
    public String testPage(@Context ServletContext context) {        
        return "<p>" + myValue + "</p>";
    }
}

我的注释界面非常直接:

package com.ttrr.myservice.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Property {
    String value() default "";
}

我有一个注释解析器类

package com.ttrr.myservice.annotations;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Properties;
public class PropertyParser {
    public static Properties properties;
    static {
        properties = new Properties();
        try {
            Property.class.getClassLoader();
            Properties defaults = new Properties();
            defaults.load(Property.class.getClassLoader().getResourceAsStream("application.properties"));
            for(Object key : defaults.keySet()) {
                properties.put(key, defaults.get(key));
            }
        } catch (IOException e) {
            //in this case do nothing, properties will simply be empty
        }
    }
    public void parse(Class<?> clazz) throws Exception {
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(Property.class)) {
                Property property = field.getAnnotation(Property.class);
                String value = property.value();
                if (!"".equals(value)) {
                    field.set(clazz, properties.getProperty(value));
                }
            }
        }
    }
}

我真正挣扎的地方是把它们放在一起,并从我的应用程序中获得价值。

感谢您花时间阅读所有这些!

您尝试设置值的方式是不正确的,因为您需要一个实例来设置值。

field.set(clazz, properties.getProperty(value));
应:

field.set(instance, properties.getProperty(value));

你应该给你的解析方法添加一个参数:

public void parse(Class<?> clazz, Object instance) throws Exception {

相关内容

  • 没有找到相关文章

最新更新