如何让 Velocity 使用 JDBC 驱动程序从数据源检索模板Microsoft?



我的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 显然找到了资源,但返回的模板为空。

有没有人遇到过类似的速度和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