Spring Dependency Injection Autowiring Null

Я смог использовать RestTemplate и автоматически подключить его. Однако я хочу переместить часть кода, связанную с шаблоном отдыха, в другой класс следующим образом:

public class Bridge {

    private final String BASE_URL = "http://localhost:8080/u";

    @Autowired
    RestTemplate restTemplate;

    public void addW() {
       Map<String, String> x = new HashMap<String, String>();
       W c = restTemplate.getForObject(BASE_URL + "/device/yeni", W.class, x);
       System.out.println("Here!");
    }
}

И в другом классе я называю это:

...
Bridge wb = new Bridge();
wb.addW();
...

Я новичок в терминах Spring и Dependency Injection. Моя переменная restTemplate имеет значение null и выдает исключение. Что я могу сделать, как решить эту проблему (я не знаю, связано ли это с тем, что я использую ключевое слово new)?


person kamaci    schedule 11.11.2011    source источник
comment
Эта проблема настолько распространена среди новичков в Spring, что я добавил ссылку на этот вопрос в тег spring вики. Я на 100% уверен, что до сих пор на него отвечали несколько раз, но я не смог найти ни одного законного вопроса. Если кто-то из вас найдет его, отметьте этот вопрос как дубликат и обновите вики.   -  person Tomasz Nurkiewicz    schedule 11.11.2011


Ответы (3)


Использование Bridge wb = new Bridge() не работает с внедрением зависимостей. Ваш restTemplate не вводится, потому что wb не управляется Spring.

Вы должны сделать свой Bridge самим компонентом Spring, например. по аннотации:

@Service
public class Bridge {
    // ...
}

или по объявлению компонента:

<bean id="bridge" class="Bridge"/>
person jeha    schedule 11.11.2011
comment
Спасибо за ваш комментарий. Как я могу разработать свою реализацию? У вас есть предложения? - person kamaci; 11.11.2011

Просто чтобы добавить к правильному ответу Джехи.

В настоящее время, делая

Bridge wb = new Bridge();

Означает, что этот экземпляр объекта не является "Spring Managed" - т.е. Весна ничего об этом не знает. Итак, как он может внедрить зависимость, о которой ничего не знает.

Как сказал Джеха. Добавьте аннотацию @Service или укажите ее в XML-файле конфигурации контекста приложения (или, если вы используете Spring 3, вы @Конфигурация объекта)

Затем, когда запускается контекст Spring, в BeanFactory будет экземпляр Singleton (поведение по умолчанию) класса Bridge.class. Либо введите это в другие объекты, управляемые Spring, либо вытащите его вручную, например.

Bridge wb = (Bridge) applicationContext.getBean("bridge"); // Name comes from the default of the class

Теперь у него будут подключены зависимости.

person James 'Cookie' Cook    schedule 11.11.2011
comment
Я использовал аннотацию Service и автоматически подключил класс Bridge к другому классу. В чем разница между Service и Configuration? - person kamaci; 11.11.2011
comment
@Configuration позволяет программно указать ваши bean-компоненты. Это не Стереотип, как @Service/@Repositry/@Component/@Controller. Кроме того, вам понадобится ‹context:component-scan base-package=com.yourpackages/› ‹context:annotation-config/› — в контексте вашего приложения. - person James 'Cookie' Cook; 11.11.2011

Если вы хотите использовать новый оператор и по-прежнему внедрять все зависимости, то вместо того, чтобы делать это компонентом Spring (путем аннотации этого с помощью @Service), сделайте его классом @Configurable.

Таким образом, даже объект, созданный новыми зависимостями оператора, будет введен.

Также требуется небольшая настройка. Подробное объяснение и пример проекта находятся здесь.

http://spring-framework-interoperability.blogspot.in/2012/07/spring-managed-components.html

person Lalit Jha    schedule 12.10.2012
comment
Есть ли шанс, что вы связаны с сайтом, на который ссылаетесь? - person Andrew Barber; 12.10.2012
comment
@Andrew Этот блог общедоступен и написан только мной, я не думаю, что это требует какой-либо принадлежности. Я не понял твоего беспокойства. - person Lalit Jha; 24.10.2012
comment
Требуется раскрывать информацию каждый раз, когда вы ссылаетесь на свой веб-сайт. - person Andrew Barber; 24.10.2012
comment
@Andrew Какие действия мне нужно предпринять? - person Lalit Jha; 08.11.2012
comment
Обязательно внимательно прочитайте Часто задаваемые вопросы о саморекламе. - person Andrew Barber; 08.11.2012
comment
Да, термины не перестают указывать на партнерский ресурс, и речь идет о продвижении товаров не за ссылки. Этот вопрос требует большой настройки, достаточной, чтобы ее нельзя было описать в комментарии, поэтому я указал на ссылку, где это делается. Что в этом плохого... и это был самый подходящий ответ. - person Lalit Jha; 16.11.2012
comment
в часто задаваемых вопросах говорится, что это применимо как для продвижения продуктов, так и для веб-сайтов. В нем также четко сказано: «Тем не менее, вы должны раскрывать свою принадлежность в своих ответах». - person user2932397; 26.11.2013