Java 使用BeanPostProcessor获取NullPointerException
我正在制作一个简单的程序来测试bean后处理器,但是得到了NullPointerException。这是我写的代码 人员类别:Java 使用BeanPostProcessor获取NullPointerException,java,spring,Java,Spring,我正在制作一个简单的程序来测试bean后处理器,但是得到了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.
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");
}
}
后处理器类:
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;
}
}
控制器类:
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
初始化后:个人
2016年4月27日晚上10:29:08 org.springframework.context.support.ClassPathXmlApplicationContext刷新
警告:在上下文初始化过程中遇到异常-取消刷新尝试:org.springframework.beans.factory.BeanCreationException:创建在类路径资源[spring.xml]中定义了名为“person”的bean时出错:调用init方法失败;嵌套异常是java.lang.NullPointerException
线程“main”org.springframework.beans.factory.BeanCreationException中出现异常:创建类路径资源[spring.xml]中定义的名为“person”的bean时出错:调用init方法失败;嵌套异常是java.lang.NullPointerException
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:772)
位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139)
位于org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:83)
位于com.controller.controller.main(controller.java:12)
原因:java.lang.NullPointerException
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.InvokeCustominetMethod(AbstractAutowireCapableBeanFactory.java:1660)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1645)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 还有12个
这就是我写的所有代码。有人能告诉我我在这里犯了什么错误吗。我很感激。我不确定您想要实现什么,但为了正常运行,BeanPostProcessor应该在其方法中返回bean实例,而不是像您那样返回null。解决方案 解释
BeanPostProcessor
是一个工厂钩子,允许自定义修改新的bean实例,例如检查标记接口或用代理包装它们
因此,此接口的目的是定义回调方法,您可以实现这些方法来提供自己的实例化逻辑,依赖项解析逻辑,修改新的bean实例等
例如,您可以在bean实例化时将bean包装在代理bean中
如果定义了PostProcessor
方法,则AbstractAutowireCapableBeanFactory
将调用后处理器
方法以获取包装的bean,您将从后处理器
方法返回null
,该方法实质上创建了null指针异常
FYI发布堆栈跟踪中的相应代码。@shmosel我发布了堆栈跟踪
@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;
}