Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 使用BeanPostProcessor获取NullPointerException_Java_Spring - Fatal编程技术网

Java 使用BeanPostProcessor获取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.

我正在制作一个简单的程序来测试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.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;
}