2017-08-08 100 views
0

我想通过调用一个类级别的注解与@RequestMapping(签到)的方法(从方法:认证),如下所示:调用由一流水平与@RequestMapping注解的方法,包括一个自动装配Autowired类

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

和我的控制器看起来像:

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

@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注解

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

有没有其他方法可以调用signIn方法?我不希望将一个已经存在的代码复制到另一个类中,只是为了得到这个工作...

+0

你为什么要在另一个控制器类中实例化一个控制器类?显示你的UserManager代码,它是否是弹簧管理的?对于身份验证和授权,我会建议使用Spring-Security,而不是创建自己的。 –

+0

我们需要验证一些操作,例如删除或更新我们网站中的某些数据,即使用户已经登录。所以我认为,不是创建另一个身份验证检查,我可以使用用于登录的方法用户进入网站,因为它基本上是一样的。我想我不能使用相同的映射,或者有没有办法为单个方法创建两个映射值? – Juni

+0

如果它是一个服务层方法,你可以在控制器中用不同的映射值或URL创建任意数量的方法。你的验证码是未知的,你试图达到的似乎并不正常,请先阅读spring文档。 –

回答

0

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

1

Autowiering只能在春天管理的bean中工作。如果您使用new关键字创建一个类,它不是弹簧管理bean,并且autowiering不起作用。

您可以尝试自动装载包含已注释方法的类,或者更好地将代码放入可由两种方法使用的服务类中。

0

@Autowired没有问题。首先有两种注释 方法基注释和字段级注释。您只是使用了字段级别的注释。请使用“org.springframework.beans.factory.annotation.Autowired”检查您的导入类,或者它可以是启动“UserManager”的问题

0

我不知道您为什么不移动逻辑成单独的服务类里面,但尝试:

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); 
} 
相关问题