4

我正在尝试配置spring配置中的推土机。当使用xml配置时,它会像在spring配置文件中设置资源

<bean class="org.dozer.spring.DozerBeanMapperFactoryBean"> 
    <property name="mappingFiles" value="classpath*:dozer/**/*.dzr.xml"/> 
</bean> 

如何在配置文件中定义资源。我尝试使用ctx.getResource(),但我无法访问配置类中的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(); 
    } 
} 
} 

还试图用使用ClassPathResource但找不到正确的方法

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

如何添加使用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; 
} 
+0

注入'ResourceLoader'或'ApplicationContext'。用它构建一个'PathMatchingResourcePatternResolver'(你也可以尝试在没有上下文或资源加载器的情况下创建),并使用'getResources'方法来获取资源。 –

+0

我不会抛出一个异常,但只要加载'抛出IOException'如果出现问题加载资源,你可能不想启动你的应用程序。 –

+0

谢谢。好点:) – alizelzele

回答

6

您需要使用ResourcePatternResolverclasspath*:dozer/**/*.dzr.xml转化为Resource[]。有两个主要选项可以使用。

  1. 注入ApplicationContext到您的配置类,它转换为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; 
    } 
} 

最后这个方法的优点是,你不依赖于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; 
    } 
} 

使用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; 
    } 
} 

或者,如果你想重用已有的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; 
    } 
} 
+0

谢谢。使用PathMatchingPatternResolver解决了我的问题。自动装配将无法在配置中工作(也许是因为它们还没有创建!)我将更新我的问题将代码。 – alizelzele

+0

''Autowired''在配置类中就像正常组件一样工作。但是没有'PathMatchingPatternResolver',所以你必须构建自己(这也是我在代码片段中展示的内容)。应注入'ResourceLoader'或'ApplicationContext'。 –

+0

注入'ResourceLoader'或'ApplicationContext'导致空指针异常。它们在应用程序上下文初始化时为空 – alizelzele

相关问题