只能在调用 isPresent() 之后访问可选值
Optional value should only be accessed after calling isPresent()
如何根据 Sonar lint 规则更改我的代码?
我的代码如下:
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"));
}
}
我无法通过 Sonar 规则。如何更改我的代码?
问题是有关 get
的警告是在未检查 isPresent
的情况下调用的。如果没有值,这将抛出 NoSuchElementException
,这违反了使用 Optional
.
的想法
@Override
public Optional<String> getUserName() {
return Optional.ofNullable(getJwt().get().getClaimAsString("preferred_username"));
}
由于 getUserName()
也返回一个 Optional
,我们可以使用 Optional#map
将 Optional<Jwt>
转换为 Optional<String>
return getJwt().map(jwt -> jwt.getClaimAsString("preferred_username")));
map
方法将为我们处理不同的情况,如下所示:
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
如何根据 Sonar lint 规则更改我的代码?
我的代码如下:
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"));
}
}
我无法通过 Sonar 规则。如何更改我的代码?
问题是有关 get
的警告是在未检查 isPresent
的情况下调用的。如果没有值,这将抛出 NoSuchElementException
,这违反了使用 Optional
.
@Override
public Optional<String> getUserName() {
return Optional.ofNullable(getJwt().get().getClaimAsString("preferred_username"));
}
由于 getUserName()
也返回一个 Optional
,我们可以使用 Optional#map
将 Optional<Jwt>
转换为 Optional<String>
return getJwt().map(jwt -> jwt.getClaimAsString("preferred_username")));
map
方法将为我们处理不同的情况,如下所示:
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 |