Zainspirowany wątkiem o wyższości innych języków nad Javą, postanowiłęm sprawdzić Kotlina.
Zacząłem przepisywać projekt nad którym obecnie pracuje, póki co muszę przyznać, całkiem fajnie to wygląda, dużo mniej kodu, niektóre rzeczy bardzo ułatwiają pracę, ale chyba czegoś nie łapie...
Mam taką metodę w repozytorium
fun findById(userId: String): UserProfile? {
return mongoTemplate.findOne(userIdQuery(userId), UserProfile::class.java)
}
I taki serwis do logowania użytkownika
@Service
class AuthenticationService(private val userRepository: UserRepository,
private val tokenProvider: JwtTokenProvider,
private val passwordEncoder: PasswordEncoder) {
fun authenticate(input: AuthenticationInput): String? {
val user = userRepository.findByEmail(input.email)
require(user != null ) {"User ${input.email} was not found"}
require(validPassword(input.password, user.password)) {"Password is incorrect"}
return tokenProvider.createToken(user.id);
}
fun validPassword(providedPassword: String, actualPassword: String): Boolean {
return passwordEncoder.matches(providedPassword, actualPassword);
}
}
No i wywala to błąd, który wiem jak poprawić ale nie do końca rozumiem czemu on tam jest?
findByEmail()
może zwrócić nulla, ok, w następnej linijce jednak to sprawdzam- metoda
validPassword
nie akceptuje nullowych wartości, ale mimo wszystko IDE nie krzyczy, że nie wolno - czy to dlatego, że wcześniej jestrequire != null
? - jeżeli tak, to dlaczego
createToken()
, który równeż wymaga nie nullowej wartości, nagle ma z tym problem?
No i dwa pytania poboczne
- wyczytałem, że
require
jest ok do takich powiedzmy biznesowych walidacji, prawda to? - nie widzę w Kotlinie
Optional
, poza tym zjava.util
, jak obsługiwać takie przypadki jak ten z repo? w Javie zwracanym typem był po prostuOptional<UserProfile>
, czy w Kotlinie też korzystać z JavowegoOptional
czy potrzebujeOption
z Vavra, czy zwracanie nulla jest ok bo i tak muszę go obsłużyć?
- screenshot-20201127212707.png (18 KB) - ściągnięć: 9