Spring : 自动装配的 bean 为空

Spring : Autowired bean is null

我正在开发一个 Spring-MVC 应用程序,我在其中自动装配一个字段,但它被设置为 NULL。我在网上检查了相同问题的解决方案,正如他们所描述的那样,我在工作时不应该创建 classes 的新实例,而是从 spring 获取它。我也试过了,但它总是抱怨找不到资源。

这是 class :

@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();
}

我尝试通过 root-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;
}

我做错了什么。你能帮忙的话,我会很高兴。非常感谢。

更新

root-context.xml 所属的图像:

问题在这里:

 GoogleAuthorization helper = new GoogleAuthorization();

当您使用 GoogleAuthorizationnew 创建时,Spring 容器不会知道我们可能认为是 spring bean 的 class 和结果它无法 Autowire 它。确保完成 @Autowiring 的 class 是一个 spring bean。尝试实例化 GoogleAuthorization 使用 FileSystemXmlApplicationContext as :

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

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

只需自动装配 GoogleAuthorization 助手(您可以这样做,因为您已经在 Spring 管理的控制器中):

@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"
}

如果您自动装配助手,它将由 Spring 注入和管理。所以 Spring 将正确构建并自动装配它。

如果您使用 'new' 自行创建实例,则根本不会有 spring 连接。

如果您在 Web 应用上下文中使用 Spring,您可以使用 ContextLoaderListener 来初始化您的 Spring-上下文。

    <!-- 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,因此无需获取应用程序上下文来执行 'lookup' ... 如果您使用 spring 试试让 spring 进行布线而不是依赖 'lookups'.