2015-07-08 3 views
1

Я работаю над приложением Spring-MVC, в котором я занимаюсь автопостановкой поля, но он получает значение NULL. Я проверил решения в сети по той же самой проблеме, как они описывают, я не должен создавать новый экземпляр классов при работе, а получать его с весны. Я тоже это пробовал, но он всегда жалуется, что ресурс не найден.Spring: Autowired bean is null

Вот класс: код

@Service 
@Transactional 
public class GoogleAuthorization{ 

    @Autowired 
    private DriveQuickstart driveQuickstart; // This guy is null 

    public void saveCredentials(final String authCode) throws IOException { 

     GoogleTokenResponse response = flow.newTokenRequest(authCode).setRedirectUri(CALLBACK_URI).execute(); 
     Credential credential = flow.createAndStoreCredential(response, null); 
     System.out.println(" Credential access token is "+credential.getAccessToken()); 
     System.out.println("Credential refresh token is "+credential.getRefreshToken()); 
// It fails at below point. 
     this.driveQuickstart.storeCredentials(credential); 
    } 

Контроллер:

@RequestMapping(value = "/getgooglelogin") 
    public String getGoogleLogin(HttpServletRequest request, HttpServletResponse response, HttpSession session,Model model) { 

     /* ApplicationContext applicationContext = new ClassPathXmlApplicationContext("../WEB-INF/spring/root-context.xml"); 
     GoogleAuthorization helper = (GoogleAuthorization) applicationContext.getBean("helper");*/ 
     GoogleAuthorization helper = new GoogleAuthorization(); 
} 

Я попытался получить его через корневой context.xml, как вы можете видеть выше, но независимо от того, какой путь я бы он не мог его найти.

DriveQuickStartImpl:

@Service 
@Transactional 
public class DriveQuickstartImpl implements DriveQuickstart{ 
// All these below guys work just fine. 
@Autowired 
    private PersonService personService; 

    @Autowired 
    private GoogleDriveService googleDriveService; 

    @Autowired 
    private GroupAttachmentsService groupAttachmentsService; 

    @Autowired 
    private GroupAccountService groupAccountService; 
} 

Что я делаю неправильно. Любая помощь будет приятной. Большое спасибо.

Update

Изображение для которой принадлежит корневой context.xml:

enter image description here

+0

Вы используете сканирование компонентов? В противном случае вам нужно явно указать весне, что нужно вводить и где. Взгляните на мое объяснение о '@ Autowired' в другом вопросе: http://stackoverflow.com/a/19419296/2083523 – Avi

ответ

1

Просто autowire помощник GoogleAuthorization (вы можете сделать это, как вы уже в Спринг управляемого контроллером):

@Service 
@Transactional 
public class DriveQuickstartImpl implements DriveQuickstart{ 

    // Other stuff... 

    @Autowired 
    private GoogleAuthorization helper; 


    @RequestMapping(value = "/getgooglelogin") 
public String getGoogleLogin(HttpServletRequest request, HttpServletResponse response, HttpSession session,Model model) { 

     // use "helper" 
} 

Если вы autowire помощника, он вводится и управляется весной. Таким образом, Spring будет строить и правильно ее автоустанавливать.

+0

Обратите внимание, что я использую конструктор, и оттуда я напрямую вызываю методы или должен использовать интерфейс? –

+0

Извините, просто попробовал, без изменений ... –

+0

Какой конструктор вы имеете в виду? –

1

Проблема здесь:

GoogleAuthorization helper = new GoogleAuthorization(); 

Как вы создали с GoogleAuthorization с new, Spring контейнер не будет знать о c который мы могли бы подумать как весенний боб, и в результате он не смог это сделать Autowire. Убедитесь, что ваш класс, в котором находится @Autowiring, является весенним бобом. Попытка инстанцировании GoogleAuthorization использованием FileSystemXmlApplicationContext как:

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(
       "src/main/webapp/WEB-INF/spring/root-context.xml"); 

GoogleAuthorization helper = (GoogleAuthorization)applicationContext.getBean("helper"); 
+0

Где я могу получить applicationContext? Вы видели код контроллера, который я опубликовал, я попробовал то же самое, выполнив поиск в XML-файле, но XML-файл не был найден независимо от того, какой путь я использовал. –

+0

Обновлен ответ! – Arpit

+0

org.springframework.beans.factory.BeanDefinitionStoreException: IOException синтаксический разбор XML-документа из ресурса пути класса [root-context.xml]; Вложенное исключение - java.io.FileNotFoundException: ресурс пути класса [root-context.xml] не может быть открыт, потому что его не существует. –

1

если вы создадите экземпляр с 'new' самостоятельно, не будет никакой проводки пружины вообще.

Если вы используете Spring в контексте Web-App, вы можете использовать ContextLoaderListener для инициализации вашего Spring-Context.

<!-- inside WEB-INF/web.xml --> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <!-- path to your Spring context configuration--> 
     <!-- for example --> 
     <param-value>/WEB-INF/spring-webapp-config.xml</param-value> 
    </context-param> 

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

+0

Я сделал то же самое, ввел компонент в Controller. –

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