@newbiebad

Почему при использовании ControllerAdvice отличается поведение?

Controller advice:
@ControllerAdvice
public class ApiControllerAdvice {
    @ExceptionHandler(ObjectNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ApiResponse notFoundError(ObjectNotFoundException exception) {
        return new ApiResponse<>(new Error(exception.getMessage()));
    }
}

Controller:
@RestController
@RequestMapping("/api/library")
public class LibraryController {

    private LibraryService libraryService;

    @RequestMapping(value = "/id/{id}/**", method = RequestMethod.GET)
    public ApiResponse<Library> findOne(@PathVariable("id") long id) throws ObjectNotFoundException {
        Library library = libraryService.findOne(id);

        if (library == null) throw new ObjectNotFoundException("Library with id " + id + " not found");

        return new ApiResponse<>(library);
    }

    <...>

    @Autowired
    public void setLibraryService(LibraryService libraryService) {
        this.libraryService = libraryService;
    }
}

При запросе к /api/library/id/{id} вылетает следующий Exception:
{
  "timestamp": 1456673434092,
  "status": 400,
  "error": "Bad Request",
  "exception": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
  "message": "Failed to convert value of type [java.lang.String] to required type [long]; nested exception is java.lang.NumberFormatException: For input string: \"api\"",
  "path": "/api/library/id/3"
}

Такое случается только если вынести ExceptionHandler в ControllerAdvice. Если положить ExceptionHandler в класс с самим контроллером, такая ошибка не возникает. Не могу понять откуда берётся input string: \"api\".
Spring boot версии 1.3.1.RELEASE.
  • Вопрос задан
  • 1146 просмотров
Решения вопроса 2
@aol-nnov
сдается мне, что для совмещения @RequestMapping-ов на уровне класса и методов, в value аннотации метода не должно быть первого слеша. как-то так.

//и controller advice тут ни при чем..
Ответ написан
@newbiebad Автор вопроса
Часть проблемы была в отмеченом решении, а часть в том, что я не пометил метод-handler аннотацией @ResponseBody.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы