使用BeanPostProcessor获取NullPointerException

时间:2016-04-28 05:26:52

标签: java spring

我正在编写一个简单的程序来测试bean post processore但是得到了NullPointerException。这是我写的代码

人类:

public class Person {

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public void init(){
    System.out.println("Bean Initialize");
}

public void destroy(){
    System.out.println("Bean Destroy");
}
}

PostProcessor类:

public class Post implements BeanPostProcessor {

@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
        throws BeansException {
    System.out.println("Before Initialization : " + beanName);
    return null;
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
        throws BeansException {
    System.out.println("After Initialization : " + beanName);
    return null;
}
}

控制器CLass:

public class Controller {

public static void main(String[] args){
    @SuppressWarnings("resource")
    AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    Person p = (Person)context.getBean("person");
    System.out.println(p.getName());
    context.registerShutdownHook();
}
}

Spring.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="person" class="com.data.Person" init-method="init" destroy-method="destroy">
    <property name="name" value="Spring"></property>
</bean>

<bean class="com.postprocessor.Post"/>

Stack Trakce:

After Initialization : person
Apr 27, 2016 10:29:08 PM org.springframework.context.support.ClassPathXmlApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'person' defined in class path resource [spring.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'person' defined in class path resource [spring.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.controller.Controller.main(Controller.java:12)
Caused by: java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1660)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1645)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 12 more

这是我写的所有代码都可以告诉我在这里做的错误是什么。我会感激的。

2 个答案:

答案 0 :(得分:5)

我不确定你想要实现什么,但为了正常运行,BeanPostProcessor应该在其方法中返回bean实例,而不是像你那样返回null。

答案 1 :(得分:2)

解决方案

@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
        throws BeansException {
    System.out.println("Before Initialization : " + beanName);
    return bean;
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
        throws BeansException {
    System.out.println("After Initialization : " + beanName);
    return bean;
}

说明

  

BeanPostProcessor是一个工厂钩子,允许自定义修改新的bean实例,例如检查标记接口或用代理包装它们。

此界面的目的是定义您可以实现的回调方法,以提供您自己的实例化逻辑依赖关系解析逻辑修改新bean实例等。

作为示例,您可以在bean实例化时将bean包装在代理bean中。

如果PostProcessor调用已定义的AbstractAutowireCapableBeanFactory方法来获取包装的bean,并且从null方法返回PostProcessor,这实际上创建了空指针例外

FYI 来自grepcode

的相应代码