在使用另一个微服务时获得空响应?



我在 Spring 开发了 2 个微服务:

  • 用户界面服务
  • 登录服务,它还具有用于测试的UI(html表单(

UI服务正在使用登录服务

用户界面服务(代码(

@RequestMapping("/log")
public String abc(HttpServletRequest request) {
final String uri = "http://localhost:8093/accounts/login";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(uri, String.class);
return result;
//request.setAttribute("mode", "MODE_LOGIN");
}

@RequestMapping("/login-user")
private String getEmployees1(HttpServletRequest request) {
final String uri = "http://localhost:8093/login-user";
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(uri, String.class);
return result;
}

登录服务(代码(

我在端口 8093 上工作。

@RequestMapping("/accounts/login") //login 
public String login(HttpServletRequest request) {
request.setAttribute("mode", "MODE_LOGIN");
return "login";
}
@RequestMapping ("/login-user") // checking user details in database
public String loginUser(@ModelAttribute User user, HttpServletRequest request) {
//ModelAndView model = new ModelAndView();
if(userService.findByEmailAndPassword(user.getEmail(), user.getPassword())!=null) {
return "index";
}
else {
request.setAttribute("error", "Invalid username and password!");
request.setAttribute("mode", "MODE_LOGIN");
return "login";
}
}

我在JSP页面中放置了以下属性MODE_HOMEMODE_LOGIN

如果我使用登录服务及其 UI 进行测试,则代码相同,它工作正常,但在从 UI 服务消费时,它正在获取null值。我可以使用该服务,但是当使用相同的服务时,控制台(console.log(中显示以下值:

select user0_.id as id1_0_, user0_.`email` as email2_0_, user0_.`fname` as fname3_0_, 
user0_.`lname` as lname4_0_, user0_.`pwd` as pwd5_0_, user0_.`phone` as phone6_0_ from user 
user0_ where user0_.`email`=? and user0_.`pwd`=?

但是当使用restTemplate从另一个使用登录服务时:

select user0_.id as id1_0_, user0_.`email` as email2_0_, user0_.`fname` as fname3_0_, 
user0_.`lname` as lname4_0_, user0_.`pwd` as pwd5_0_, user0_.`phone` as phone6_0_ from user user0_ 
where (user0_.`email` is null) and (user0_.`pwd` is null)

我是新手。

可能是什么问题?

问题

您的代码调用登录服务时没有查询参数,只需使用基本 URL:

http://localhost:8093/login-user

因此,将创建模型User,但其字段emailpassword未设置(两者都仍null(。

如果然后将User对象传递给 SQL 查询,则相应的参数也会被计算为null

因此,在控制台日志中,生成的 SQL 也显示null,而不是需要一些有效值。

溶液

将所需的查询参数emailpassword传递给restTemplate.getForObject的调用。

通过使用 Spring 的RestTemplate的方法getForObject(String url, Class<T> responseType, Map<String,?> uriVariables)通过将查询参数作为 map 传递给getForObject

Map<String, Object> parameterMap = new HashMap<>();
parameterMap.put("email", "theEmail@domain.com");
parameterMap.put("password", "secret");
restTemplate.getForObject(uri, String.class, parameterMap);

或者使用 Spring 的 UriComponentsBuilder 构建完整的 URL(包括查询参数(并像这样传递它:

UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(uri)
.queryParam("email","theEmail@domain.com")
.queryParam("password","secret")
.build();
restTemplate.getForObject(uriComponents.toUriString(), String.class);

在这两种方法中,生成的HTTP GET都将使用以下URL:

http://localhost:8093/login-user?email=theEmail@domain.com&password=secret

参见

  • 关于使用@ModelAttribute的类似问题
  • 关于使用RestTemplate的类似问题
  • Baeldung的Java Spring Tutorial: The Guide to UriComponentsBuilder
  • Baeldung的Java Spring Tutorial: The Guide to RestTemplate

相关内容

  • 没有找到相关文章

最新更新