当前位置: 首页 > 知识库问答 >
问题:

只能在调用isPresent()后访问可选值

慕凌龙
2023-03-14

我如何根据声纳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"));
    }
}

我不能通过声纳规则。我怎么能改变我的代码?

共有1个答案

田晨
2023-03-14

问题是,在未选中isPresent的情况下,调用get时会发出警告。如果不存在值,它将抛出NoTouchElementException,这违反了使用Optional的想法。

    @Override
    public Optional<String> getUserName() {
        return Optional.ofNullable(getJwt().get().getClaimAsString("preferred_username"));
    }

由于getUserName()也会返回一个Optional,我们可以使用Optional#map来转换Optional

 return getJwt().map(jwt -> jwt.getClaimAsString("preferred_username")));

map方法将为我们处理不同的情况,如下所示:

 类似资料: