Spring Boot 调用@Value-annotation中的方法/函数

edqdpe6u  于 2023-04-06  发布在  Spring
关注(0)|答案(1)|浏览(118)

在一个投影对象中,每当当前登录用户的ID等于相应记录/元素上的用户ID时,我试图引入一个字段isOwner
所以,基本上就是这样:

public interface Quiz {

    @Value("#{userUtil.equalsLoggedInUser(target.appUser)}")
    Boolean isOwner();

}

为此,我有一个UtilService,它获取登录的用户记录并进行必要的比较,如下所示:

@Service
public class UserUtil {

    private final AppUserRepository appUserRepository;

    @Autowired
    public UserUtil( AppUserRepository appUserRepository) {
        this.appUserRepository = appUserRepository;
    }

    public AppUserEntity getLoggedInAppUserEntity() {
        String uid = ServiceUtil.getUidFromPrincipal();
        return this.appUserRepository.findUserByFirebaseUuid(uid)
                .orElseThrow(() -> new UsernameNotFoundException("Invalid or unknown \"uid\"."));
    }

    public Boolean equalsLoggedInUser(AppUserEntity appUserEntity) {
        return Objects.equals(appUserEntity.getId(), this.getLoggedInAppUserEntity().getId());
    }
}

以及

@Configuration
public class UtilBeans {
    @Bean
    public UserUtil getUserUtil(AppUserRepository appUserRepository) {
        return new UserUtil(appUserRepository);
    }
}

我相信这可以做得更干净和/或更有效,但现在我只希望它的工作。

错误

运行代码,我得到的错误表明,找不到userUtil
已解决[org.springframework.http.converter.HttpMessageNotWritableException:无法写入JSON:EL 1008 E:在类型为“org.springframework.data.projection.SpelEvaluatingMethodInterceptor$TargetWrapper”的对象上找不到属性或字段“userUtil”-可能不是公共的或无效的?]
我不确定如何在SPEL中使用UserUtil,我也尝试过定义UserUtil的静态版本

@Value("#{T(server.service.UserUtil).equalsLoggedInUser(target.appUser)}")
Boolean isOwner();

最后还是犯了同样的错误

tnkciper

tnkciper1#

请使用

@Configuration
public class UtilBeans {
    @Bean
    public UserUtil userUtil(AppUserRepository appUserRepository) {
        return new UserUtil(appUserRepository);
    }
}

@Value("#{getUserUtil.equalsLoggedInUser(target.appUser)}")

相关问题