Получаете нулевой ответ при использовании другого микросервиса?

Я разработал 2 микросервиса весной:

  • UI-сервис
  • служба входа, которая также имеет пользовательский интерфейс (html-форму) для тестирования

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";
    }
}

Я разместил следующие атрибуты MODE_HOME и MODE_LOGIN на JSP-странице.

Тот же код, если я тестирую службу входа в систему с ее пользовательским интерфейсом, он работает нормально, но при использовании службы пользовательского интерфейса он принимает значение 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)

Я новичок в этом.

В чем может быть проблема?


person Manish Goyal    schedule 08.01.2020    source источник
comment
Похоже, что ваша служба входа ожидает, что в запросе будет существовать объект User, но не похоже, что вы отправляете какую-либо информацию о пользователе при вызове службы входа из службы пользовательского интерфейса.   -  person Jordan    schedule 08.01.2020
comment
@Jordan, как я могу отправить это?   -  person Manish Goyal    schedule 08.01.2020


Ответы (1)


Проблема

Ваш код вызывает службу входа без параметров запроса, только с базовым 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", "[email protected]");
parameterMap.put("password", "secret");

restTemplate.getForObject(uri, String.class, parameterMap);

Или используйте UriComponentsBuilder Spring для создания полного URL-адреса (включая параметры запроса) и передачи его следующим образом:

UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl(uri)
  .queryParam("email","[email protected]")
  .queryParam("password","secret")
  .build();

restTemplate.getForObject(uriComponents.toUriString(), String.class);

В обоих подходах результирующий HTTP GET будет использовать следующий URL-адрес:

http://localhost:8093/[email protected]&password=secret

Смотрите также

person hc_dev    schedule 08.01.2020