Получение нулевого ответа при использовании другого микросервиса? - PullRequest
0 голосов
/ 08 января 2020

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

  • a UI-сервис
  • a Login-сервис , который также имеет UI (html -форма) для тестирования

UI-сервис использует Login-сервис .

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

Login-сервис (код)

У меня это работает на порту 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 -странице.

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

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

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

1 Ответ

1 голос
/ 09 января 2020

Issue

Ваш код вызывает Login-сервис без параметров запроса , только с базовым URL:

http://localhost:8093/login-user

В результате будет создана модель User, но ее поля email и password не установлены (оба по-прежнему null).

Если затем передать объект User вашему SQL -запрос, соответствующие параметры также оцениваются как null.

Таким образом, в журнале консоли результирующий SQL отображается также с null, где вместо этого можно ожидать допустимые значения.

Решение

Передать необходимые параметры запроса email и password на вызов restTemplate.getForObject.

Либо с помощью метода RestTemplate Spring 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's 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

См. также

...