我的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