【问题标题】:Getting null response while consuming another microservice?在使用另一个微服务时获得空响应?
【发布时间】:2020-04-26 10:06:20
【问题描述】:

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

  • UI 服务
  • 一个登录服务,它也有用于测试的 UI (html-form)

UI-service 正在使用 Login-service

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)

我是新手。

可能是什么问题?

【问题讨论】:

  • 您的登录服务似乎期望请求中存在 User 对象,但当您从 UI 服务调用登录服务时,您似乎没有发送任何用户信息.
  • @Jordan 我怎么发送那个?

标签: java mysql spring spring-mvc spring-rest


【解决方案1】:

问题

您的代码调用登录服务 不带查询参数,仅使用基本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) 将查询参数作为映射传递给 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

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    相关资源
    最近更新 更多