2013-11-12 2 views
0

Я новичок в весне. Я создал один класс боба и файл конфигурации, как показано ниже:Создание конструктора объектов по умолчанию не создается весной

beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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.xsd"> 

    <bean id="employee" class="com.asd.bean.Employee"> 
     <constructor-arg index="0" type="java.lang.String" value="kuldeep" /> 
     <constructor-arg index="1" type="java.lang.String" value="1234567" /> 
    </bean> 

</beans> 

Employee.java

package com.asd.bean; 

public class Employee { 

    private String name; 
    private String empId; 

    public Employee() { 
     System.out.println("Employee no-args constructor"); 
    } 

    Employee(String name, String empId) 
    { 
     System.out.println("Employee 2-args constructor"); 
    this.name=name; 
    this.empId=empId; 
    } 

    /** 
    * @return the name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * @param name the name to set 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * @return the empId 
    */ 
    public String getEmpId() { 
     return empId; 
    } 

    /** 
    * @param empId the empId to set 
    */ 
    public void setEmpId(String empId) { 
     this.empId = empId; 
    } 

    public String toString() { 
     return "Name : "+name+"\nEID : "+empId; 

    } 

} 

, когда я пытаюсь получить боб с помощью ApplicationContext его дает следующее исключение:

Исключение в потоке «main» org.springframework.beans.factory.BeanCreationException: ошибка создания bean-компонента с именем «employee», определенным в ресурсе пути класса [Problem.xml]: 2 аргумента конструктора, но не найден соответствующий конструктор в bean-файле 'employee' (подсказка: укажите аргументы index/type/name для простых параметров, чтобы избежать неоднозначностей типов)

Теперь, если я удаляю публикацию из конструктора по умолчанию, он отлично работает и даже в том случае, если оба конструктора открыты и работают. Пожалуйста, объясните, почему он показывает это поведение ???

Спасибо заранее.

+0

Какая версия весны вы? Это отлично работает для меня независимо от модификатора видимости на конструкторе. –

+1

Возможно, Employee (String name, String empId) не отображается. Сделайте это общедоступным. – Masudul

+0

@Masud Нет, это не относится к весне. Это сделает «Конструктор» доступным, если нужно. –

ответ

2

Я только проверил, что это работает в 3.2.4 и что оно не относится к 3.0.0. Реализация, о которой идет речь, составляет ConstructorResolver#autowireConstructor() в 3.0.0. Этот метод используется для разрешения правильного конструктора для использования. В этой реализации, мы получаем весь класс компонента Constructor экземпляров с помощью Class#getDeclaredConstructors(), который возвращает

Возвращает массив объектов Constructor, отражающих все конструкторов, объявленных в классе, представленный этот объектом класса. Элементы возвращенного массива не отсортированы и не указаны в произвольном порядке .

Он сортирует этот массив, вызвав

AutowireUtils.sortConstructors(candidates); 

какого

Сортировать заданные конструкторы, предпочитая публичные конструктор и «жадные» те, с максимумом аргументов. Результат будет содержать публичных конструкторов с уменьшением количества аргументов, затем непубличных конструкторов, опять же с уменьшением количества аргументов.

Другими словами, конструктор без аргументов будет отображаться первым, а потому, что не имеют аргументы требуют немедленно сделать метод autowireConstructor() бросить Exception, в противном случае. Обходной путь заключается в том, что ваш другой конструктор имеет менее ограничительную видимость.

В реализации 3.2.4, хотя он по-прежнему сортирует конструкторы в том же самом случае, если конструктор найден с перечнем параметров, который не соответствует количеству аргументов, он пропускается. В этом случае он будет работать. Конструктор no arg будет пропущен, и конструктор 2 аргументов будет согласован, разрешен и использован.

Смежные вопросы