Ich bin neu zu Spring Boot, aber nach ein paar Stunden Lesen von Beiträgen und Blogs über Ausnahme handlig in Spring Boot REST, wo niemand etwas über die Behandlung solcher Ausnahme geschrieben von benutzerdefinierten Converter, I geschrieben beschlossen, hier zu schreiben.Ausnahmebehandlung in Spring Boot REST von benutzerdefinierten Konverter
Ich entwickle kleine REST-App basierend auf Spring Boot einfach von IntelliJ generiert. Exemplarische Verfahren sieht wie folgt aus
@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));
}
}
Da beide guid
und lang
String sind und ich wollte diese Stücke von Informationen stark typisierte aus demselben Anfang waren, habe ich einfach Konverter für GUID
und Language
Typen und registriert es in Anwendungsklasse:
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
wirft Ausnahme von Verfahren Fabrik,
...
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
null zurückgeben, dann werfe ich benutzerdefinierte Ausnahme vom Konverter. Registrierung in Anwendung:
@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);
}
}
alle Art von Umgang mit Ausnahme Verwendung mit @ResponseStatus
, @ControllerAdvice
und @ExpectationHandler
Ich konnte nicht Konvertern Ausnahmen in Controller-fangen neu zu schreiben (oder besser Karte) ‚Status‘, ‚Fehler‘, " Ausnahme "und" Nachricht "von JSON Fehlerantwort Originalfeld zu meinen Werten. Wahrscheinlich, weil die Ausnahmen vor dem Aufruf meiner REST-Methode ausgelöst werden. Ich habe auch eine Lösung mit ResponseEntityExceptionHandler
versucht, aber es hat überhaupt nicht funktioniert.
Für die Anforderung http://localhost:8080/resources/users/620e643f-406f-4c69-3f4c-3f2c303f3f3f/projects/langs/end
wo richtige Sprache en
ist, Reaktion mit Ausnahme ist:
{
"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"
}
wo benutzerdefinierte Ausnahme in message
Feld nur an der letzten Position ist aber natürlich Austausch sollte mit Meine benutzerdefinierte Nachricht. Und benutzerdefinierte Exception sollte in exception
Feld sein, wo jetzt Spring Ausnahme ist. Es ist natürlich das Ziel, keine Ahnung, wie man es in diesem Zusammenhang erreichen kann.
Bitte lösen Sie mein Problem mit Abfangen von Ausnahmen von Konvertern und Mapping sie den Weg, wie es mit @ControllerAdvice
und Ausnahmen von Controllern geworfen werden kann. Thx im Voraus.
Bitte fügen Sie die Ausnahme auf Ihre Frage eine
HttpServletRequest
in Ihre Fehlerbehandlungsmethode injizieren – msparer