最近在将老项目使用dubbo框架整合,出现这么个问题:
就是原先service层代码里面有用到HttpServetRequest,因为dubbo远程调用,所以在service层取不到HttpServetRequest,然后准备在controller客户端拿到HttpServetRequest再通过传参的方式传到service层,结果在service端接收到的参数全部为null。
原先的代码(截取部分):
@Autowired
private HttpServletRequest request;
@Override
public Map<String, Object> getLoginPermission(String systemId, UserToken userToken) {
if(systemId==null){
systemId = systemService.selectFirstSystemId(userToken.getRoles());
}
//选中的系统
request.setAttribute("choiceSystem", systemId);
List<SPermission> list = getAuthPermission(systemId, userToken.getRoles());
List<VoPermissionMenu> menuList = new ArrayList<VoPermissionMenu>();
使用dubbo之后通过传参的方式:
@Override
public Map<String, Object> getLoginPermission(HttpServletRequest request,String systemId, UserToken userToken) {
if (systemId == null) {
List<String> roles = new ArrayList<>();
roles.add("B6A5E1B48BD04D4A8696D156A17795C4");
systemId = systemService.selectFirstSystemId(roles);
}
if (StrTools.isNullOrEmpty(systemId)) {
List<VoPermissionMenu> menuList = new ArrayList<VoPermissionMenu>();
Map<String, SPermission> permMap = new HashMap<String, SPermission>();
Map<String, Object> ret = new HashMap<String, Object>();
ret.put("menuList", menuList);
ret.put("permMap", permMap);
return ret;
}
//选中的系统
request.setAttribute("choiceSystem", systemId);
List<SPermission> list = getAuthPermission(systemId, userToken.getRoles());
结果request、systemId、userToken里的参数全为null,UseToken也序列化了;
解决方法:
因为dubbo不能序列化HttpServletRequest,而且通过服务调用传参HttpServletRequest也不正确,这就导致接收端的request和其他的所有参数全为null。所以将HttpServletRequest里面需要的参数拿出来再通过调用服务传参的方式传递,
如果在service层向HttpServletRequest里面赋值,可以在controller层实现,比如上面代码示例,需要给request赋值choiceSystem,我可以通过getLoginPermission方法返回choiceSystem,
最后在controller客户端写request.setAttribute("choiceSystem", systemId);