spring-data-jpa 是否可以读取@Repository中的属性文件值?

emeijp43  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(210)

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

dwbf0jvd

dwbf0jvd1#

正如M.代努姆在评论部分提到的,@Repository只是@Component的一个变体,可以通过注入Environment来读取属性文件,也可以只使用@Value

nwnhqdif

nwnhqdif2#

如果您使用类存储库,则可以在任何非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);
    }

}

很明显,应该有一个属性名my.property,在application.properties中有一个int值。
(you甚至可以对JPA存储库执行相同的操作)

相关问题