我的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的类似问题?

最佳答案

您可以配置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

07-24 09:38
查看更多