Как я могу заставить Velocity извлечь шаблон из источника данных с помощью драйвера JDBC Microsoft? - PullRequest
0 голосов
/ 12 октября 2019

Мое Java-приложение ранее работало с базой данных SQL Server с использованием драйвера Sourceforge jTds. Он мог использовать движок 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?

1 Ответ

0 голосов
/ 12 октября 2019

Вы можете настроить 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
...