Я написал фрагмент кода для проверки конфигурации xw с autowire. Но я все время получал исключение нулевого указателя, которое указывало на сбой автопроводки поля.
Вопреки некоторым другим примерам, которые могут работать, я обнаружил, что метод getter возвращает тип, отличный от поля, которое должно быть подключено. Удалите этот метод получения или измените тип возвращаемого значения, тогда он будет работать.
Но я не знаю причину. Почему метод геттера имеет значение? Я думал, что метод сеттера используется для соединения, как насчет метода геттера?
public class Department {
private String departName;
public String getDepartName() {
return departName;
}
public void setDepartName(String departName) {
this.departName = departName;
}
}
public class Employee {
private Department department;
// 1) below code will cause NPE
public String getDepartment() {
return department.getDepartName();
}
// 2)below code works, or just delete 1) code works as well
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public void foo() {
System.out.println(department.getDepartName());
}
}
Файл конфигурации autowire xml выглядит следующим образом:
<bean id="depart" class="com.kingdom.Department">
<property name="departName" value="risk"/>
</bean>
<bean id="employee" class="com.kingdom.Employee" autowire="byType">
</bean>
и, наконец, основной класс:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Employee employee = (Employee) ctx.getBean("employee");
employee.foo();
Я ожидаю, что отдел может быть автоматически подключен к сотруднику. Но я получил NPE.
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:294)
at java.lang.Thread.run (Thread.java:748)
Caused by: java.lang.NullPointerException
at com.kingdom.Employee.foo (Employee.java:17)
at com.kingdom.Main.main (Main.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke (Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run (ExecJavaMojo.java:294)
at java.lang.Thread.run (Thread.java:748)
После изменения типа возвращаемого значения он работает.
Но кто-нибудь должен знать, что происходит позади? почему геттерный метод подрывает автопроводку?