2016-05-23 4 views
0

У меня возникли проблемы инъекционного типа Bean в качестве параметра конструктору из файла свойств. Я могу ввести его, передав значение @Qualifier («beanName») следующим образом.инъекционной Фасоль с использованием Spring аннотаций в Параметры конструктора с имуществом Закончено Местом

@Component("circle") 
public class Circle implements Shape { 

} 

@RestController 
class MyController {  
    private final Shape shape; 

    @Autowired 
    public MyClass(@Qualifier("circle") 
      Shape shape) { 
    this.shape = shape;  
    } 
} 

Однако приведенные ниже примеры кода не работают.

Это возвращает Null.

@RestController 
class MyController {  
    private final Shape shape; 

    @Autowired 
    public MyClass(@Qualifier("${shape}") 
      Shape shape) { 
    this.shape = shape;  
    } 
} 

Пробовал с помощью @Resource (Name = "$ {формы}") вместо @Qualifier как упомянуто здесь ( Spring: Using @Qualifier with Property Placeholder) но получаю ошибку компилятора " '@Resource' не относится к параметру"

@Resource ("$ {} форма") дает ошибку "не удается найти метод 'значение'"

Это не работает слишком:

@RestController 
class MyController {  
    @Value("${shape}") 
    private final String shapeBean; //Compiler error : "Variable 'shapeBean' might not have been initialised" 
    //Not declaring shapeBean as final will give a compiler error at @Qualifier: "Attribute value must be constant" 
    private final Shape shape; 

    @Autowired 
    public MyClass(@Qualifier(shapeBean) 
      Shape shape) { 
    this.shape = shape;  
    } 
} 

Код не работает. Дает ошибку компилятора в @Qualifier: «Значение атрибута должно быть постоянным».

@RestController 
class MyController {  
    @Value("${shape}") 
    private final String shapeBean; 
    private final Shape shape; 

    @Autowired 
    public MyClass(@Qualifier(shapeBean) 
      Shape shape) { 
    this.shape = shape;  
    } 
} 

Также попробовал следующее. Оба бросают исключение NullPointerException при попытке получить доступ к форме.

@Resource(name="${shape}") 
private Shape shape; // In addition, throws a warning saying, "Private field 'shape' is never assigned" 

@Autowired 
@Resource(name="${shape}") 
private Shape shape; 

Если параметр конструктора был примитивным или строку, я мог бы просто использовать @value («$ {формы}») и ввести значение переменной. Но поскольку это класс, я не уверен, как это сделать.
Не мог бы кто-нибудь сказать мне, настроен ли я неправильно или что я должен делать?

+0

Итак, вы хотите выбрать разные формы во время выполнения? Вообще говоря, вы бы использовали что-то вроде подобных профилей. Можете ли вы уточнить свое фактическое приложение? – chrylis

+0

Предполагая из приведенного выше примера, у меня есть интерфейс Shape и конкретные классы, реализующие форму. Но пока в моем контроллере я хочу, чтобы в объект Shape вводилась только форма круга. Раньше я использовал @Qualifier («круг»), который работал отлично. Но так как я не хочу держать его жестко закодированным, я хотел бы получить его из файла свойств. Есть ли способ получить значение из файла свойств и затем вставить это значение в объект Shape? – Arthas

ответ

0

не Круга все методы реализованы бы, что это определено в форме? - до тех пор, пока выполняется контракт формы, вы должны быть в порядке. Теперь в случае, когда у вас есть несколько фигур, например Triangle, Rectangle и Circle, и по какой-то причине вы хотите динамически загружать точный подкласс, вы можете захотеть получить конкретный компонент с помощью ApplicationContext.getBean ("").

Вы можете сохранить ссылку на различные возможные формы Переопределелив afterPropertiesSet() - смотреть на InitialingBean и во время выполнения используйте правый боб.

+0

На данный момент я пользуюсь услугами Circle. В какой-то момент я могу отказаться от услуг, предоставляемых _Circle_, и подписаться на услуги, предоставляемые _Triangle_. Следовательно, в качестве исправления я хочу объявить поставщика услуг в файле свойств, а не объявлять его в моем контроллере. Есть ли способ присвоить значение свойства с помощью аннотаций? – Arthas

+0

Да, простой способ был бы использовать пружинные профили, чтобы активировать набор боба (ов) на основе spring.profile.active переменного окр Простые уроки приведены ниже https: // весна.io/blog/2011/02/14/spring-3-1-m1-introduction-profile/ http://www.mkyong.com/spring/spring-profiles-example/ – JVXR