Robię proste API-walidator, do którego wysyłany jest request podczas wypełniania formularzy na front-endzie.
Np. rejestruje się nowy użytkownik, wpisuje login który jest już zajęty, i dostaje od razu podpowiedź że powinien wybrać inny login bo ten jest już zajęty.
API jest wywoływane AJAXem, zwraca 200 jeśli wartość nie istnieje w bazie, albo 403 jeśli wartość istnieje. Na tej podstawie wyświetlam odpowiednie komunikaty przy formularzu.
Wymyśliłem coś, ale IDE narzeka że Optional
nie powinien być przekazywany jako parametr metody. Jakie są tu inne możliwości?
Repozytorium (User
rozszerza AbstractEntity
)
public interface UserRepository extends CrudRepository<User, Long> {
Optional<User> findOneByEmail(String email);
}
Kontroler - walidator
@Controller
@RequestMapping("/signupCheck")
public class SignupCheckController extends RemoteValidator<User> {
@Autowired
private UserRepository userRepository;
@RequestMapping(value = "/email", method = RequestMethod.GET)
public ResponseEntity<String> checkEmail(@RequestParam(name = "email") String email) {
return performCheck(userRepository.findOneByEmail(email));
}
I abstrakcja którą chcę jakoś poprawić:
public abstract class RemoteValidator<T extends AbstractEntity> {
protected ResponseEntity<String> performCheck(Optional<T> entity) {
if (entity.isPresent()) {
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
} else {
return new ResponseEntity<>(HttpStatus.OK);
}
}
Ponieważ jednak czytałem, że nie powinno się używać Optionali jako parametrów metod, zastanawiam się jak można to inaczej rozwiązać?
- Zwrócić z repozytorium po prostu Usera, przekazać i zrobić null-checka
- Zastosować jakiś wzorzec projektowy typu Null Object
- Albo zupełnie zmienić koncepcję walidatora i wykorzystać mechanizmy Springa, stworzyć klasę wyjątku na niepoprawne dane i zwracać 4xx jeśli wyjątek wystąpi?
Dzięki
filemonczykfilemonczyk