3

Jasper レポートに顧客のフォントを読み込む必要があるため、フォント拡張機能を使用します。問題は、レガシーの問題により、クラスパスではなくローカル マシンからフォント ファイルをロードしたいことです。だから、私は次のように設定します

ファイル 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 内) は place 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)

ソリューション

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

1 に答える 1

4

春のドキュメントによると、

Bean ファクトリ ポスト プロセッサは、org.springframework.beans.factory.config.BeanFactoryPostProcessor インターフェースを実装する Java クラスです。これは手動で (BeanFactory の場合) または自動的に (ApplicationContext の場合) 実行され、BeanFactory の構築後に何らかの変更を全体に適用します。Spring には、以下で説明する PropertyResourceConfigurer や PropertyPlaceHolderConfigurer など、既存の Bean ファクトリ ポスト プロセッサが多数含まれています。また、BeanNameAutoProxyCreator は、他の Bean をトランザクション的に、または他の種類のプロキシでラップするのに非常に役立ちます。このマニュアルで後述します。

1 つの方法は、XMLBeanFactory の代わりに ApplicationContext を使用することです。

他の方法次のようなポスト プロセッサを呼び出します。

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);
于 2013-05-09T11:11:47.193 に答える