Как правильно обрабатывать исключения из сервиса (весенний загрузочный отдых) - PullRequest
0 голосов
/ 23 ноября 2018

При создании API отдыха с использованием весенней загрузки, что является лучшим способом обработки исключений из уровня обслуживания и передачи их контроллеру, поэтому клиент получает пользовательское сообщение об ошибке json .

{
    "message": "some error"
}

Конечная точка от контроллера

@PostMapping("/login")
public String login(@RequestBody @Valid LoginDto loginDto) {
    return gson.toJson(userService.login(loginDto.getUsername(), loginDto.getPassword()));
} 

Код уровня обслуживания

public LoginResponseDto login(String username, String password) {

        try {
            //performs some checks
            ...
            return new LoginResponseDto(token.get());
        } catch (AuthenticationException e){
            LOGGER.info("Log in failed for user {}", username);
        }
    return new LoginResponseDto("login failed");
}

LoginResponseDto class

String token;
String message;

public LoginResponseDto(String message) {
    this.message = message;
}

В настоящее время он, очевидно, возвращает правильное сообщение, но не правильный код состояния, он покажет статус 200 с сообщением об ошибке в json.

1 Ответ

0 голосов
/ 23 ноября 2018

У вас есть несколько вариантов:

1) Возврат сообщения:

Если вы хотите вернуть что-то подобное,

{
    "message": "some error"
}

Что вы можете сделатьis:

Вариант 1. Создайте пользовательский класс POJO для сообщения об ошибке и верните ссылку на объект этого класса POJO.

Примерно так:

ErrorMessage.java

package org.example;

public class ErrorMessage {
    private String message;

    public ErrorMessage(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Метод обработчика запросов в контроллере:

@GetMapping("/login{?username, password}")
public ErrorMessage isUserAuthenticated(@RequestParam String username, @RequestParam String password) { 

    if (username.toLowerCase().contentEquals("root") && password.contentEquals("system")) {
        return new ErrorMessage("authenticated");
    }

    return null;
}

Опция 2. Создайте карту и вставьте пары ключ-значение, которые выхотите иметь в сообщении.

Пример:

@GetMapping("/login{?username, password}")
public Map<String, String> isUserAuthenticated(@RequestParam String username, @RequestParam String password) { 
    Map<String, String> message = new HashMap<>();

    if (username.toLowerCase().contentEquals("root") && password.contentEquals("system")) {
        message.put("message", "authenticated");
    }

    return message;
}

2) Возврат кода ошибки (настоятельно рекомендуется мной):

Вы можете использовать ResponseEntity дляс этой целью.

@GetMapping("/login{?username, password}")
public ResponseEntity<?> isUserAuthenticated(@RequestParam String username, @RequestParam String password) { 
    if (username.toLowerCase().contentEquals("root") && password.contentEquals("system")) {
        return new ResponseEntity<>(HttpStatus.OK);
    }

    return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...