通过使用 @RequestMapping 注释的 class 级别调用方法,其中包括自动装配的 class

calling a method by class level annotated with @RequestMapping that includes an autowired class

我正在尝试通过 class 级别(来自方法:身份验证)调用带有 @RequestMapping(signIn) 注释的方法,如下所示:

@RequestMapping(value = /authenticate, method = RequestMethod.POST)
public @ResponseBody Response authentication(HttpServletRequest request) 
{
    UserController user = new UserController();     
    return user.signIn(request, null);
}

我的控制器看起来像:

@Autowired
private UserManager userManager;

@RequestMapping(value = /signin, method = RequestMethod.POST)   
public @ResponseBody Response signIn(HttpServletRequest request) {      
        JsonObject json = Misc.parseJson(request);
        String lang = Misc.getLang(request);
        user.setEmail(Misc.getEmail(json));
        user.setPassword(Misc.getEncryptedPassword(json));

        return ResponseUtils.success(userManager.auth(user, lang));

}

用户管理器用@component注解:

   @Component
   public class UserManager {
        public User auth(User user, String lang) {
         ....
        return user;
       }
   }

问题是当我调用方法 "signIn" 并通过“/authenticate”映射新建一个 UserController 实例时,UserManager 变为 NULL。所以现在我假设以这种方式完成时自动装配不起作用。

请问还有其他调用登录方法的方法吗?我不想将一个已经存在的代码复制粘贴到另一个 class 只是为了让它工作...

Autowiering 仅适用于 spring 托管 bean。如果您使用 new 关键字创建 class,则它不是 spring 托管 bean,自动装配将不起作用。

您可以尝试自动装配包含注释方法的 class 或更好地将代码放在服务 class 中,这两种方法都可以使用。

@Autowired 没有问题。有两种注解 首先是方法基础注解和字段级注解。您刚刚使用字段级别 annotation.Check 您的导入 class 和 "org.springframework.beans.factory.annotation.Autowired" 或者 "UserManager"

的启动可能有问题

我不知道你为什么不将逻辑移到单独的服务类中,但试试这个:

UserController.java

public UserController(UserManager userManager) {
    this.userManager = userManager;
}

然后在认证资源方法所在的控制器内部:

@Autowired UserManager userManager;

@RequestMapping(value = /authenticate, method = RequestMethod.POST)
public @ResponseBody Response authentication(HttpServletRequest request) {
    UserController user = new UserController(userManager);
    return user.signIn(request);
}

所以最后我只是把逻辑分开了。尽管我尝试过并且可以使用的一种解决方案是仅向 signIn 方法添加另一个映射,而不是在另一个 class 中添加新方法,因为逻辑是相似的。我仍然选择了一个单独的逻辑,因为我的目的在 signIn 方法中有很多不必要的代码。