How can I change my code according to Sonar lint rules?
My code is below:
public interface TokenParser {
public Optional<String> getUserName();
}
public class JWTTokenParser implements TokenParser {
private Optional<Jwt> getJwt() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) {
return Optional.empty();
}
return Optional.ofNullable((Jwt) authentication.getPrincipal());
}
@Override
public Optional<String> getUserName() {
return Optional.ofNullable(getJwt().get().getClaimAsString("preferred_username"));
}
}
I could not pass the Sonar rules. How can I change my code?
CodePudding user response:
The problem is warning about the get is called without checking isPresent. Which will throw NoSuchElementException if no value is present, it violates the idea of using Optional.
@Override
public Optional<String> getUserName() {
return Optional.ofNullable(getJwt().get().getClaimAsString("preferred_username"));
}
Since getUserName() is also returning an Optional, we may use Optional#map to convert Optional<Jwt> to Optional<String>
return getJwt().map(jwt -> jwt.getClaimAsString("preferred_username")));
map method will take care different case for us, as below:
| getJwt() | jwt.getClaimAsString("preferred_username") | return |
|---|---|---|
| empty | will not call | Optioal.empty() |
| empty | will not call | Optioal.empty() |
| not empty | return null | Optioal.empty() |
| not empty | return non null value | Optional with non null value |
