【问题标题】:How can I get Velocity to retrieve a template from a datasource with Microsoft JDBC driver?如何让 Velocity 使用 Microsoft JDBC 驱动程序从数据源中检索模板?
【发布时间】:2019-10-11 22:01:24
【问题描述】:

我的 Java 应用程序之前使用 Sourceforge jTds 驱动程序针对 SQL Server 数据库运行。它能够使用 Apache Velocity 引擎 (v2.0) 从数据库中的 varchar(max) 列中检索模板。现在数据库将被加密,因此 JTDS 不再工作——甚至无法成功连接。我已将其替换为 Microsoft JDBC 驱动程序 (mssql-jdbc-7.2.2.jre8)。由于此错误,现在 Velocity 资源加载器无法找到任何资源:

com.microsoft.sqlserver.jdbc.SQLServerException:从转换 不支持将 varchar 转为 BinaryStream。

尝试将列类型更改为文本。同样的错误。尝试更改为图像。然后 Velocity 显然找到了资源,但返回的模板是空的。

有人遇到过 Velocity 和 Microsoft JDBC 的类似问题吗?

【问题讨论】:

    标签: java sql-server jdbc velocity


    【解决方案1】:

    您可以配置 Velocity 以使用您自己的数据源资源加载器:

    package com.foo;
    
    import org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader;
    
    import java.io.Reader;
    import java.io.StringReader;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class MyDataSourceResourceLoader extends DataSourceResourceLoader
    {
        /**
         * Gets a reader from a result set's column
         * @param resultSet
         * @param column
         * @param encoding
         * @return reader
         * @throws SQLException
         */
        protected Reader getReader(ResultSet resultSet, String column, String encoding)
            throws SQLException
        {
            return new StringReader(resultSet.getString(column));
        }
    }
    

    不检查编码,因此它们应该在应用程序和数据库之间保持一致。

    然后您通过设置以下配置属性来告诉 Velocity 使用您的资源加载器:

    resource.loaders = ds
    resource.loader.ds.class = com.foo.MyDataSourceResource
    

    【讨论】:

    • 感谢您的回复。这当然是有道理的。但是,我正在查看的 DataSourceResourceLoader 类没有要覆盖的 getReader() 方法。请问您假设的是哪个版本的 Velocity?我使用的是 1.7(对不起,我最初没有指定)。无论如何,你让我走上了解决问题的道路,所以我感谢你。
    • @RobertNoble 您在问题中说:“它能够使用 Apache Velocity 引擎 (v2.0)”...在 1.7 中,您必须覆盖 public synchronized InputStream getResourceStream(final String name) throws ResourceNotFoundException 方法。
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多