Я новичок в Spring Boot, но после нескольких часов чтения сообщений и блогов об исключении handlig в Spring Boot REST, где никто ничего не писал о обработке такого исключения, выброшенного из пользовательского конвертера, I решил написать здесь.Обработка исключений в Spring Boot REST, отброшенном из пользовательского конвертера
Я разрабатываю небольшое приложение REST на основе Spring Boot, которое просто создается из IntelliJ. Примерный метод выглядит следующим образом
@RestController
@RequestMapping("/resources")
public class CVResourceService {
private final TechnologyRepository technologyRepository;
private final ProjectRepository projectRepository;
@Autowired
public CVResourceService(TechnologyRepository technologyRepository, ProjectRepository projectRepository) {
this.technologyRepository = technologyRepository;
this.projectRepository = projectRepository;
}
@RequestMapping(value = "https://stackoverflow.com/users/{guid}/projects/langs/{lang}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Collection getUserProjects(@PathVariable("guid") GUID userGUID, @PathVariable("lang") Language language) {
return ProjectDTOAssembler.toDTOs(projectRepository.findOne(userGUID, language));
}
}
Поскольку оба guid
и lang
являются строками, и я хотел это фрагменты информации, были сильны типизированными из тех же начала, я создал просто преобразователь для GUID
и Language
типов и зарегистрировал его в классе Application:
public final class GUIDConverter implements Converter{
@Override
public GUID convert(String source) {
return GUID.fromString(source);
}
}
public class LanguageConverter implements Converter{
@Override
public Language convert(String source) {
Language language = Language.of(source);
if (language == null) { throw new WrongLanguagePathVariableException(); }
return language;
}
}
GUID
бросает исключение из метода фабрики,
...
public static GUID fromString(String string) {
String[] components = string.split("-");
if (components.length != 5)
throw new IllegalArgumentException("Invalid GUID string: " + string);
return new GUID(string);
}
...
Language
return null, поэтому я выбрал исключение из конвертера. Регистрация в Заявке:
@SpringBootApplication
public class Application extends WebMvcConfigurerAdapter {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new GUIDConverter());
registry.addConverter(new LanguageConverter());
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Используя все виды обработки исключений с @ResponseStatus
, @ControllerAdvice
и @ExpectationHandler
я не мог поймать исключения переработчиков в контроллер переписать (или лучше карту) „Статус“, „ошибка“, " исключение "и" сообщение "исходного поля ответа json error к моим значениям. Вероятно, потому что исключения вызывают перед вызовом моего метода REST. Я также попробовал решение с ResponseEntityExceptionHandler
, но это не сработало.
Для запроса http://localhost:8080/resources/users/620e643f-406f-4c69-3f4c-3f2c303f3f3f/projects/langs/end
где правильный язык en
, ответ исключением является:
{
"timestamp": 1458812172976,
"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 [com.cybercom.cvdataapi.domain.Language]; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.PathVariable com.cybercom.cvdataapi.domain.Language] for value 'end'; nested exception is com.cybercom.cvdataapi.interfaces.rest.converter.WrongLanguagePathVariableException",
"path": "/resources/users/620e643f-406f-4c69-3f4c-3f2c303f3f3f/projects/langs/end"
}
где обычай исключение только в последнюю позицию в message
поле, но, конечно, должен быть обмен с мое пользовательское сообщение. И пользовательское excetion должно быть в поле exception
, где теперь исключение Spring. это, конечно, цель, не знаю, как добиться этого в этом контексте.
Пожалуйста, решите мою проблему с исключениями, которые выбрасываются из конвертеров и отображают их так, как это может быть сделано с помощью @ControllerAdvice
и исключений, отброшенных от контроллеров. Thx заранее.
Пожалуйста, добавьте исключение на ваш вопрос – msparer