2013-05-09 84 views
2

我需要在Jasper报告中加载客户字体,所以我使用字体扩展。问题是我想从本地机器加载字体文件,而不是由于遗留问题导致的类路径。所以,我配置为folliwingXmlBeanFactory无法加载属性文件作为占位符?

文件jasperreports_extension.properties

net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.extensions.SpringExtensionsRegistryFactory 

net.sf.jasperreports.extension.fonts.spring.beans.resource=META-INF/fonts/fonts.xml 

#extra properties for font path 
font.path=C:/Windows/Fonts 

而且fonts.xml

<?xml version="1.0" encoding="UTF-8"?> 

<beans:beans 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.3.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> 

<beans:bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    <beans:property name="locations" value="classpath:jasperreports_extension.properties"> <!--reads config.properties file--> 
    </beans:property> 
</beans:bean> 
<beans:bean id="Verdana" class="net.sf.jasperreports.engine.fonts.SimpleFontFamily"> 

    <beans:property name="name" value="Verdana"/> 

    <beans:property name="normal" value="file:${font.path}/VERDANA.TTF"/> 

    <beans:property name="bold" value="file:${font.path}/VERDANAB.TTF"/> 

    <beans:property name="italic" value="file:${font.path}/VERDANAI.TTF"/> 

    <beans:property name="boldItalic" value="file:${font.path}/VERDANAZ.TTF"/> 

    <beans:property name="pdfEncoding" value="Identity-H"/> 

    <beans:property name="pdfEmbedded" value="true"/> 
</beans:bean> 

但似乎XmlBeanFactory中(在SpringExtensionsRegistryFactory.java)不能使用地方hoder加载属性或我错过了什么?

错误日志:

org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (4) are: 
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'normal' threw exception; nested exception is net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error opening input stream from URL : file:${font.path}/VERDANA.TTF 
PropertyAccessException 2: org.springframework.beans.MethodInvocationException: Property 'bold' threw exception; nested exception is net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error opening input stream from URL : file:${font.path}/VERDANAB.TTF 
PropertyAccessException 3: org.springframework.beans.MethodInvocationException: Property 'italic' threw exception; nested exception is net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error opening input stream from URL : file:${font.path}/VERDANAI.TTF 
PropertyAccessException 4: org.springframework.beans.MethodInvocationException: Property 'boldItalic' threw exception; nested exception is net.sf.jasperreports.engine.JRRuntimeException: net.sf.jasperreports.engine.JRException: Error opening input stream from URL : file:${font.path}/VERDANAZ.TTF 
    org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) 
    org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1393) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 

SOLUTIONS

以下人士Himanshu的指导下,我创建SpringExtensionsRegistryFactory.java的一个子类,如下,并用它作为jasperreports_extension.properties工厂类。它充当魅力。

public class SpringExtensionsRegistryFactory extends 
     net.sf.jasperreports.extensions.SpringExtensionsRegistryFactory { 
    protected ListableBeanFactory getBeanFactory(String registryId, 
      JRPropertiesMap properties) 
    { 
     ListableBeanFactory factory = super.getBeanFactory(registryId, properties); 
     PropertyPlaceholderConfigurer cfg = (PropertyPlaceholderConfigurer)factory.getBean("propertyConfigurer"); 
     cfg.postProcessBeanFactory((XmlBeanFactory)factory); 
     return factory; 
    } 
} 

回答

4

作为每弹簧文档,

bean工厂后处理器是一个Java类,它实现org.springframework.beans.factory.config.BeanFactoryPostProcessor接口。它是手动执行的(在BeanFactory的情况下)或自动执行(在ApplicationContext的情况下),在构造完成后将某种类型的更改应用于整个BeanFactory。 Spring包括许多预先存在的bean工厂后处理器,如下面将要描述的PropertyResourceConfigurer和PropertyPlaceHolderConfigurer,以及BeanNameAutoProxyCreator,这对于在本手册后面介绍的事务性或任何其他类型的代理包装其他bean非常有用。

单程使用ApplicationContext代替XMLBeanFactory。

其他方式调用后处理器类似:

XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); 
// create placeholderconfigurer to bring in some property 
// values from a Properties file 
PropertyPlaceholderConfigurer cfg = factory.getBean("<bean id of the property configurer>") 
// now actually do the replacement 
cfg.postProcessBeanFactory(factory); 
+0

我做你建议,但仍然没有读出的属性。 – bnguyen82 2013-05-09 11:21:20

+0

查看已更新的答案 – 2013-05-09 11:32:31

+0

非常感谢Himanshu。它适用于我。 – bnguyen82 2013-05-09 11:54:22

相关问题