Я бы рекомендовал использовать опцию соединения JDBC при создании сложного отчета, хотя бы только для гибкости, получаемой при написании SQL-кода напрямую. Но наличие вторжения JDBC-соединения в слой представления не очень хорошо звучит, поэтому, не зная ничего о Spring, я скажу переместить фактическое создание отчета вниз на уровень обслуживания, чтобы он возвращал объект JasperPrint (который сериализуем) на уровень представления, где это может быть представлено.
Вот пример простого ванильного RMI, в значительной степени, как я это делаю. Я полагаю, это можно перевести в какой-нибудь Spring bean-компонент.
public interface ReportService extends Remote {
public JasperPrint fillReport(final JasperReport report, final Map reportParameters)throws RemoteException, JRException;
}
public class ReportServiceImpl implements ReportService {
final Connection connection;
public ReportServiceImpl(final Connection connection) {
this.connection = connection;
}
public JasperPrint fillReport(final JasperReport report, final Map reportParameters) throws RemoteException, JRException {
return JasperFillManager.fillReport(report, reportParameters, connection);
}
}
Одна из модификаций, которая приходит на ум, без намерений каламбура, состоит в том, чтобы метод fillReport принимал имя отчета или путь в качестве аргумента вместо фактического объекта JasperReport, и чтобы служебный уровень загружал его (и кэшировал его после загрузки отчет является относительно дорогой операцией).
Дайте мне знать, если вы хотите, чтобы я конкретизировал некоторые части этого примера, я должен предупредить вас, что я программист на настольных компьютерах и Swing, имея лишь элементарный опыт работы с веб-интерфейсами.