Zastanawiam się, jak poprawnie wdrożyć Spring Controller, który ma służyć jako usługa REST. Szczególnie chciałbym spróbować uczynić interfejs możliwie jak najwierniejszym. Chciałbym również skorzystać z kodów błędów HTTP, aby moi klienci mogli odpowiednio działać.Sprężynowy kontroler serwisowy MVC z obsługą błędów wykonano poprawnie?
Zastanawiam się, jak wdrożyć moje metody, więc zwracają JSON, jeśli wszystko działa dobrze (w treści odpowiedzi) lub rzucić kod błędu http, jak również niestandardowy powód, dlaczego nie działa (może błędy, które przyszły z DAO lub bazy danych). Jednak nie jestem pewien, która z nich jest właściwa? Zwróć ciąg i dodaj wartości, aby powrócić do Modelu, lub zwróć HashMap i umieść tam moje rzeczy? lub zwrócić obiekty bezpośrednio? ale co wtedy, gdy wystąpi błąd i nie mogę zwrócić tej klasy? zamiast tego zwraca wartość null? Ja po 2-3 sposoby robi to, że można sobie wyobrazić:
@RequestMapping(value="/addUser", method= RequestMethod.POST)
public String addUser(@RequestBody User user, HttpServletResponse response, Model model) throws Exception{
try{
userService.addUser(user);
model.addAttribute("user", userService.getUser(user.getUsername(), user.getPassword()));
return "user";
}catch(Exception e){
model.addAttribute("error", e.toString());
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
return "error";
}
}
czy raczej w ten sposób:
@RequestMapping(value="/addUser", method= RequestMethod.POST)
public @ResponseBody Map addUser(@RequestBody User user, HttpServletResponse response){
Map map = new HashMap();
try{
userService.addUser(user);
map.put("success", true);
map.put("username", user.getUsername());
}catch (KeyAlreadyExistsException e){
map.put("success", false);
map.put("Error", e.toString());
response.sendError(HttpServletResponse.SC_FORBIDDEN, e.toString());
}catch(Exception e){
map.put("success", false);
map.put("Error", e.toString());
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
}
finally {
return map;
}
}
Zdaję sobie sprawę, kod nie jest „w porządku”, ale nie mogę dowiedzieć się, jak sprawiają, że tak musi być. Może niektóre odpowiedzi na pytania pomogłyby? Thx za wsparcie już
Podoba mi się ten pomysł, właśnie to zrobiłem! Stworzyłem ressource błędów zgodnie z zaleceniami Bartka, a następnie wszystkie błędy w ctrl w tej metodzie. Prawdopodobnie mógłbym dalej generalizować i obsługiwać aplikacje błędów szeroko, ale krok po kroku. – pascalwhoop
można utworzyć wiele wyjątków ExceptionHandlers w kontrolerze, dla każdego typu wyjątku. –
znalazłem, że wydaje się być czystsze, jeśli mam tylko jeden wyjątkowy sposób na kontroler, zamiast całej ich tablicy, a następnie zadbać o sprawdzenie, który błąd został zgłoszony w ramach tego obsługi – pascalwhoop