相关疑难解决方法(0)

@autowired在静态类中

这是一个带有Hibernate的Spring MVC项目.我正在尝试创建一个Logger类,负责将日志输入数据库.其他类只调用具有一些属性的正确方法,这个类应该做所有的魔术.本质上它应该是一个具有静态方法的类,但这会导致autoiering dao对象出现问题.

public class StatisticLogger {
    @Autowired
    static Dao dao;
    public static void AddLoginEvent(LogStatisticBean user){
        //TODO code it god damn it
    }
    public static void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
        //TODO code it god damn it
    }
    public static void addErrorLog(Exception e, String page,  HashMap<String, Object> parameters){
        ExceptionLogBean elb=new ExceptionLogBean();
        elb.setStuntDescription(e);
        elb.setSourcePage(page);
        elb.setParameters(parameters);
        if(dao!=null){ //BUT DAO IS NULL
            dao.saveOrUpdateEntity(elb);
    }
}
Run Code Online (Sandbox Code Playgroud)

怎么做对了?我该怎么做才能使dao对象为null?我知道我可以将它作为方法参数传递,但这不是很好.我猜测autowired无法在静态对象上工作,因为它们是为早期创建的,所以尚未创建自动维护机制.

spring hibernate spring-mvc autowired static-class

21
推荐指数
2
解决办法
4万
查看次数

获取类的所有方法的新方法是什么,包括Java 8的继承默认方法?

我想获取类的所有方法,包括public,protected,package和private方法,以及包括继承的方法.

记得:

  • Class.getDeclaredMethods()获取public,protected,package和private方法,不包括继承的方法.
  • Class.getMethods获取继承的方法,只获取公共方法.

在Java 8之前,我们可以做一些事情:

Collection<Method> found = new ArrayList<Method>();
while (clazz != null) {
    for (Method m1 : clazz.getDeclaredMethods()) {
        boolean overridden = false;

        for (Method m2 : found) {
            if (m2.getName().equals(m1.getName())
              && Arrays.deepEquals(m1.getParameterTypes(), m2
                  .getParameterTypes())) {
            overridden = true;
            break;
            }
        }
        if (!overridden) found.add(m1);
    }

    clazz = clazz.getSuperclass();
}
return found;
Run Code Online (Sandbox Code Playgroud)

但是现在,如果类使用默认方法实现某些接口而不被具体超类覆盖,则这些方法将逃避上述检测.此外,现在有关于具有相同名称的默认方法的规则,并且还必须考虑这些规则.

问题:获取类的所有方法的当前推荐方法是什么:

"all"的最常见定义应该是可以在类的实例方法中直接访问的方法,而不使用super或类名:

  • 包括在类本身中声明的public,protected,package和private方法.
  • 包括其超类的受保护方法.
  • 包括同一包的超类的包方法.
  • 包括其接口的默认方法(未覆盖/隐藏的方法,请参见此处此处).
  • 包含具有适当可访问性的静态方法(类和超类). …

java reflection inheritance java-8

19
推荐指数
1
解决办法
5387
查看次数

JUnit @BeforeClass非静态解决Spring Boot应用程序

@BeforeClass如果要在所有@Test方法之前运行一次,JUnit的注释必须声明为static .但是,这不能用于依赖注入.

@Autowire在运行JUnit测试之前,我想用Spring Boot 清理一个数据库.我不能@Autowire静态字段所以我需要考虑一个解决方法.有任何想法吗?

junit spring unit-testing dependency-injection spring-boot

18
推荐指数
2
解决办法
2万
查看次数