Wpis z mikrobloga

Mireczki z #spring jakie podejście lepiej przyjąć podczas tworzenia restapi

takie:

@RestController
public class SignUpController {

private static Logger logger = LoggerFactory.getLogger(SignUpController.class);

@Qualifier("DefaultSignUp")
@Autowired
private SignUpUseCase signUpUseCase;

@RequestMapping(value="/users", method=RequestMethod.POST)
public ResponseEntity signup(@RequestBody NewUser newUser){
try {
signUpUseCase.signUp(newUser);
return ResponseEntity.status(HttpStatus.OK).body(null);
}catch(UserAlreadyExistsException e) {
logger.warn("New user identitifying self with email {} already exists!", newUser.getEmail());
return ResponseEntity.status(HttpStatus.CONFLICT).body(null);
}catch(CannotSendActivationMessageException e){
logger.error(String.format("Cannot send activation message for user %s", newUser.getEmail()), e);
return ResponseEntity.status(451).body(null);
}
}

}

czy po prostu wyrzucić try-catch i każdy z wyjątków dodać do sygnatury oraz adnotować je jako @ResponseStatus ?
  • 6
  • Odpowiedz
@badAttitude: zrób globalny Exception Handler i tam loguj i zwracaj odpowiedni response.

To jest słabe, bo jeżeli dwa kontrolery rzucają ten sam wyjątek, musisz powielić kod catcha
  • Odpowiedz
@baczus zgadzam się, że kod się powieli ale jak dla mnie downside używania takiego rozwiązania z ResponseCode na wyjątku to:

a) nie widać na pierwszy rzut oka kodu odpowiedzi tylko trzeba wchodzi w deklaracje wyjątków
b) a co jeśli dany wyjątek w jednym kontrolerze ma zwracać kod np. 460 a w drugim 470
  • Odpowiedz