在spring配置文件中设置资源

ali*_*ele 4 configuration resources spring classpath spring-annotations

我想在spring配置中配置推土机.当使用xml配置时,它就像

<bean class="org.dozer.spring.DozerBeanMapperFactoryBean">
    <property name="mappingFiles" value="classpath*:dozer/**/*.dzr.xml"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

如何在配置文件中定义资源.我尝试使用ctx.getResource()但我无法访问Configuration类中的ApplicationContext.

我尝试了ContextRefreshedEvent并从那里添加资源,但仍然没有运气.(已调用afterPropertiesSet并且添加的映射不起作用)

public class ContextRefreshedEventBuilder extends ContextRefreshedEvent {
public ContextRefreshedEventBuilder(ApplicationContext ctx) {
    super(ctx);
    DozerBeanMapperFactoryBean mapper = ctx.getBean(DozerBeanMapperFactoryBean.class);
    try {
        mapper.setMappingFiles(ctx.getResources("classpath*:dozer/**/*.dzr.xml"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

还尝试使用ClassPathResource但无法找到正确的方法

DozerBeanMapperFactoryBean mapper = new DozerBeanMapperFactoryBean();
mapper.setMappingFiles(new Resource[]{new ClassPathResource("classpath*:dozer/**/*.dzr.xml")});
return mapper;
Run Code Online (Sandbox Code Playgroud)

如何将ClassPathResource添加为映射位置?

- -回答 - -

@Bean
public DozerBeanMapperFactoryBean configDozer() throws IOException {
    DozerBeanMapperFactoryBean mapper = new DozerBeanMapperFactoryBean();
    Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath*:dozer/**/*.dzr.xml");
    mapper.setMappingFiles(resources);
    return mapper;
}
Run Code Online (Sandbox Code Playgroud)

M. *_*num 6

你需要用a ResourcePatternResolver来翻译classpath*:dozer/**/*.dzr.xml成一个Resource[].您可以使用2种主要选项.

  1. 将其注入ApplicationContext配置类,将其强制转换为a ResourcePatternResolver并使用该getResources方法.Al Spring默认应用程序上下文实现实现了该ResourcePatternResolver接口.
  2. PathMatchingResourcePatternResolver使用或不使用前面提到的上下文创建一个.
  3. 使用ResourcePatternUtils注射ResourceLoader.

使用ResourcePatternUtils

@Configuration
public class MyConfiguration {

    @Autowired
    private ResourceLoader resourceLoader;

    public DozerBeanMapperFactoryBean mapper() throws IOException {
        DozerBeanMapperFactoryBean mapper = new DozerBeanMapperFactoryBean();
        // ResourceLoader is allowed to be null when using the ResourceLoaderUtils.
        ResourcePatternResolver resolver = ResourceLoaderUtils.getResourcePatternResolver(resourceLoader);
        Resource[] mappingFiles = resolver.getResources("classpath*:dozer/**/*.dzr.xml");
        mapper.setMappingFiles(mappingFiles);
        return mapper;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一种方法的优点是你不仅仅依赖于PathMatchingResourcePatternResolver界面.实用程序类根据注入的ResourceLoader内容确定它.人们应该更喜欢这种加载资源的方式.

使用ApplicationContext

@Configuration
public class MyConfiguration {

    @Autowired
    private ApplicationContext context;

    public DozerBeanMapperFactoryBean mapper() throws IOException {
        DozerBeanMapperFactoryBean mapper = new DozerBeanMapperFactoryBean();
        Resource[] mappingFiles = ((ResourcePatternResolver) context).getResources("classpath*:dozer/**/*.dzr.xml");
        mapper.setMappingFiles(mappingFiles);
        return mapper;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用PathMatchingResourcePatternResolver

@Configuration
public class MyConfiguration {

    private PathMatchingPatternResolver resolver = new PathMatchingPatternResolver();

    public DozerBeanMapperFactoryBean mapper() throws IOException {
        DozerBeanMapperFactoryBean mapper = new DozerBeanMapperFactoryBean();
        Resource[] mappingFiles = resolver.getResources("classpath*:dozer/**/*.dzr.xml");
        mapper.setMappingFiles(mappingFiles);
        return mapper;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想重用已经存在ResourceLoader的略有不同的版本:

@Configuration
public class MyConfiguration {

    @Autowired
    private ResourceLoader resourceLoader;

    public DozerBeanMapperFactoryBean mapper() throws IOException {
        DozerBeanMapperFactoryBean mapper = new DozerBeanMapperFactoryBean();
        Resource[] mappingFiles = new PathMatchingPatternResolver(resourceLoader).getResources("classpath*:dozer/**/*.dzr.xml");
        mapper.setMappingFiles(mappingFiles);
        return mapper;
    }
}
Run Code Online (Sandbox Code Playgroud)