jasperreports 5.6.0和Hibernate 4 NoSuchFieldError:BOOLEAN

时间:2014-06-09 07:38:14

标签: java hibernate jasper-reports

我正在使用spring,hibernate和jasperreports构建基于maven的web应用程序。

这是applicationContext.xml文件

<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${driverBinder}" />
    <property name="url" value="${urlBinder}" />
    <property name="username" value="${usernameBinder}" />
    <property name="password" value="${passwordBinder}" />
</bean>

<bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="myDataSource"/>

    <property name="annotatedClasses">
        <list>
        ...
        </list>
    </property>

    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${dialectBinder}</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
</bean>

生成报告的Java类

@Controller
public class DefaultGenerator extends AbstractView {

    @Autowired
    @Qualifier("mySessionFactory")
    protected SessionFactory sessionFactory;
    private static Session session;
    private static Transaction transaction;

    private static OutputStream outputStream;
    private static JasperPrint jasperPrint;

    @Override
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {

        session = sessionFactory.openSession();
        transaction = session.beginTransaction();

        outputStream = response.getOutputStream();
        HashMap parameters = (HashMap) model.get("parameters");

        parameters.put(JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION, session);

        URL reportTemplate = getClass().getClassLoader().getResource("someFile.jrxml");
        JasperReport jasperReport = JasperCompileManager.compileReport(reportTemplate.getPath());
        jasperPrint = JasperFillManager.fillReport(jasperReport, parameters);

        transaction.rollback();
        session.close();

        render(new JRPdfExporter());
    }

    private void render(Exporter exporter) throws JRException {
        List<JasperPrint> jasperPrintList = new ArrayList<>();
        jasperPrintList.add(jasperPrint);
        exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrintList));
        exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(outputStream));
        exporter.exportReport();
    }
}

什么也没发生。我正在变成一个错误 - java.lang.NoSuchFieldError:BOOLEAN。 它也在这里描述 - http://community.jaspersoft.com/questions/536345/jasperreports-376-and-hibernate-36-errors 看起来自Hibernate的3.6版以后就有类BOOLEAN了。但jasperreports尝试使用它......

任何人都可以帮助我,并告诉我如何尽可能地做到这一点吗?我正在使用Maven,所以我的队友可能会更新一次库,所以我不想重新编译jasperreports库。

感谢。

2 个答案:

答案 0 :(得分:0)

喜欢写在这里http://jasperreports.sourceforge.net/sample.reference/hibernate/

  

其中一个专门用于数据访问的中间层工具是Hibernate(今天:Hibernate 3.3)(...)

...最新的jasperreports 5.6是否有可能认为hibernate的实际版本是3.3而不是4.3? OO

两个星期的解决方案,没有任何事情:/

答案 1 :(得分:0)

来自jasperreports 5.6.0 pom

    ...
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>3.0.5</version>
        <scope>compile</scope>
        <exclusions>
            <exclusion>
                <groupId>javax.transaction</groupId>
                <artifactId>jta</artifactId>
            </exclusion>
        </exclusions>
        <optional>true</optional>
    </dependency>
    ...

它确实带来了休眠3。

这是JasperReports 5.6.0中一个类的片段,其中jasperreports试图找到hibernate.BOOLEAN类。

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Session;
import org.hibernate.type.Type;

/**
 * HQL query executer that uses Hibernate 3.
 * 
 * @author Lucian Chirita (lucianc@users.sourceforge.net)
 * @version $Id: JRHibernateQueryExecuter.java 7199 2014-08-27 13:58:10Z teodord $
 */
public class JRHibernateQueryExecuter extends JRAbstractQueryExecuter
{
    private static final Log log = LogFactory.getLog(JRHibernateQueryExecuter.class);

    protected static final String CANONICAL_LANGUAGE = "HQL";

    private static final Map<Class<?>,Type> hibernateTypeMap;

    static
    {
        hibernateTypeMap = new HashMap<Class<?>,Type>();
        hibernateTypeMap.put(Boolean.class, Hibernate.BOOLEAN);
        hibernateTypeMap.put(Byte.class, Hibernate.BYTE);
        hibernateTypeMap.put(Double.class, Hibernate.DOUBLE);
        hibernateTypeMap.put(Float.class, Hibernate.FLOAT);
        hibernateTypeMap.put(Integer.class, Hibernate.INTEGER);
        ...

只要您尝试使用该版本的JRHibernateQueryExecutor,您将被限制为Hibernate 3.0。

在这里,您可以在JasperReports开发树中看到history of JRHibernateQueryExecutor

我相信你需要this change才能支持更新的hibernate版本。

该变更于2015年6月提交。

如果你看看mvnrepository.com上的history of the jasperreports releases,你会发现6.1.1是maven的第一个版本,可能包含你需要使用更新版本的hibernate所需的更改。

我刚尝试使用5.6.0(以及6.1.0)与Hibernate 4并重复您的错误。然后我尝试使用6.1.1并且该错误消失了。