使用另一个微服务时得到空响应?
Getting null response while consuming another microservice?
我在Spring开发了2个微服务:
- 一个UI-服务
- 一个登录服务,它还有UI(html-form)用于测试
UI-服务正在使用登录服务。
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_HOME
和 MODE_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`=?
但是当使用 Login-service 从另一个使用 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)
我是新手。
可能是什么问题?
问题
您的代码调用 Login-service 不带查询参数,仅使用 base-URL:
http://localhost:8093/login-user
因此,模型 User
将被创建,但其字段 email
和 password
未设置(两者仍为 null
)。
如果随后将 User
对象传递给您的 SQL 查询,相应的参数也会计算为 null
。
因此,在控制台日志中,结果 SQL 也显示为 null
,而应该是一些有效值。
解决方案
将所需的查询参数 email
和 password
传递给 restTemplate.getForObject
的调用。
通过使用 Spring 的 RestTemplate
方法 getForObject(String url, Class<T> responseType, Map<String,?> uriVariables)
通过将查询参数作为映射传递给 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
另见
- 关于 using @ModelAttribute
的类似问题
- 关于 using RestTemplate
的类似问题
- Baeldung 的 Java Spring 教程:The Guide to UriComponentsBuilder
- Baeldung 的 Java Spring 教程:The Guide to RestTemplate
我在Spring开发了2个微服务:
- 一个UI-服务
- 一个登录服务,它还有UI(html-form)用于测试
UI-服务正在使用登录服务。
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_HOME
和 MODE_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`=?
但是当使用 Login-service 从另一个使用 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)
我是新手。
可能是什么问题?
问题
您的代码调用 Login-service 不带查询参数,仅使用 base-URL:
http://localhost:8093/login-user
因此,模型 User
将被创建,但其字段 email
和 password
未设置(两者仍为 null
)。
如果随后将 User
对象传递给您的 SQL 查询,相应的参数也会计算为 null
。
因此,在控制台日志中,结果 SQL 也显示为 null
,而应该是一些有效值。
解决方案
将所需的查询参数 email
和 password
传递给 restTemplate.getForObject
的调用。
通过使用 Spring 的 RestTemplate
方法 getForObject(String url, Class<T> responseType, Map<String,?> uriVariables)
通过将查询参数作为映射传递给 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
另见
- 关于 using @ModelAttribute 的类似问题
- 关于 using RestTemplate 的类似问题
- Baeldung 的 Java Spring 教程:The Guide to UriComponentsBuilder
- Baeldung 的 Java Spring 教程:The Guide to RestTemplate