在 @Repository 中读取属性文件值是否可能?

3

是否可以在@Repository内读取属性文件的值。 如有帮助,将不胜感激。


2
无论是在@Service@Controller或其他任何@Component中,都没有任何区别。 - M. Deinum
1
我尝试了相同的操作,但是针对@Repository。代码如下:public interface TransferMessageRepository extends JpaRepository<TransferMessage, Long> { @Value("${spring.hibernate.jdbc.fetch_size}") String abcd; 但是这会导致错误,提示变量可能已经初始化或未初始化。 - Jijo Francis
现在这是你没有提到的事情,也是一个完全不同的问题。不,那行不通。 - M. Deinum
我们有解决方案吗? - Jijo Francis
没有。 - M. Deinum
显示剩余2条评论
2个回答

1
如果你使用一个类仓库,你可以在任何非 final 字段上使用 @Value 注解,让它自动填充。
另一方面,如果你正在使用一个接口仓库,你无法直接读取属性,因为你没有地方注入你的组件/值。
不管怎样,我发现了一种可行的解决方法,可以用来实现类似的结果。
首先,你需要创建一个实现 ApplicationContextProvider 接口的类:
@Component
public class StaticPropertiesProvider implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(@Nonnull final ApplicationContext applicationContext) throws BeansException {
        StaticPropertiesProvider.applicationContext = applicationContext;
    }

    public static <T> T getProperty(final String property, final Class<T> clazz) {
        return applicationContext.getEnvironment().getProperty(property, clazz);
    }

}

当您的应用程序启动时,静态的applicationContext字段将被填充为您的应用程序上下文,以便您可以在之后从静态的getProperties方法中使用它。
然后,您可以在存储库内的默认方法中调用它,例如:
public interface MyRepository extends MongoRepository<MyDocument, String> {

    @Query(value = "{'myProperty': ?0}")
    List<MyDocument> findByMyProperty(int myProperty);

    default List<MyDocument> findByMyProperty() {
        final var myPropertyDefault = StaticPropertiesProvider.getProperty("my.property", Integer.class);
        return this.findByMyProperty(myProperty);
    }

}

显然,在application.properties文件中应该有一个名为my.property的属性名,其值为整数。

(即使使用JPA存储库也可以这样做)


1
如M.Deinum在评论部分中提到的,@Repository只是@Component的一个变体。您可以通过注入Environment来读取您的属性文件,或者您也可以使用@Value

我尝试了相同的操作,但是针对@Repository。代码如下:public interface TransferMessageRepository extends JpaRepository<TransferMessage, Long> { @Value("${spring.hibernate.jdbc.fetch_size}") String abcd; 但是这会导致错误,提示变量可能已经初始化或未初始化。 - Jijo Francis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接