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();
当您使用 GoogleAuthorization
和 new
创建时,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'.
我正在开发一个 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();
当您使用 GoogleAuthorization
和 new
创建时,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'.