2016-09-12 4 views
0

Недавно я обновил API отчетов Jasper от 4.5.1 до 6.3. С 4.5.1 отчеты экспортируются в формат HTML, PDF. Для отчетов HTML есть возможность переходить к дочернему отчету. Чтобы настроить ссылки для обработки параметров запроса и предварительной обработки открытия дочернего отчета, создали ExtensionRegistryFactory и зарегистрировали JRHyperlinkProducerMapFactory для обработки гиперссылок.Jasper Report 6.3 Расширение гиперссылки

Я заметил, что расширение зарегистрировано правильно, но оно не привыкает. Проверьте исходный код отчета Jasper 6.3 и попытайтесь отладить причину, затем заметили, что метод: net.sf.jasperreports.engine.JRAbstractExporter.getHyperlinkProducer(JRPrintHyperlink) не возвращает JRHyperlinkProducer.

Вот код ExtensionsRegistryFactory:

public class HyperlinkExtensionsRegistryFactory implements ExtensionsRegistryFactory 
{ 
    @Override 
    public ExtensionsRegistry createRegistry(String registryId, JRPropertiesMap properties) 
    { 
     return new ExtensionsRegistry() 
     { 
      @Override 
      public List getExtensions(Class extensionType) 
      { 
       if (extensionType.equals(JRHyperlinkProducerFactory.class)) 
       { 
        JRHyperlinkProducerMapFactory producerFactory = new JRHyperlinkProducerMapFactory(); 
        producerFactory.addProducer("ReportExecution", new RemoteExecutionHyperlinkProducer()); 
        producerFactory.addProducer("Custom", new ExpandCollapseHyperlinkProducer()); 
        return Arrays.asList(producerFactory); 
       } 
       return null; 
      } 
     }; 
    } 

    public static class RemoteExecutionHyperlinkProducer implements JRHyperlinkProducer 
    { 
     @Override 
     public String getHyperlink(JRPrintHyperlink hyperlink) 
     { 
      return [custom link generation logic]; 
     } 
    } 

    public static class ExpandCollapseHyperlinkProducer implements JRHyperlinkProducer 
    { 
     @Override 
     public String getHyperlink(JRPrintHyperlink hyperlink) 
     { 
      return [custom link generation logic]; 
     } 
    } 
} 

С помощью этого класса, создали запись для jasperreports_extension.properties файла. Вот его содержание:

net.sf.jasperreports.extension.registry.factory.HyperlinkExtensionFactory=<fully_qualified_path_to_HyperlinkExtensionsRegistryFactory> 

Я ничего не пропустил? Если есть какая-то ошибка, которую я делаю, то любезно помогите узнать ее.

+0

Кажется, что есть ошибка в JasperReports, начиная с версии 5.5.2, когда новый API для настройки экспортеров имеет был введен. Мы это осознаем и скоро исправим. Тем не менее, до тех пор, для этого есть обходной путь, но это зависит от того, как вы создаете своего экспортера HTML. Не могли бы вы отправить код для создания экземпляра вашего экспортера, чтобы я мог дать точный ответ? – Narcis

ответ

0

Thanks Narcis для ввода.

Я проверил исходный код Jasper Report 6.3.0 и попытался понять, как заменить реестр Hyperlink. Нашел работу для этого. Надеюсь, что это будет полезно для других. Вот фрагмент кода для регистрации расширения гиперссылки.

Экспортер

AbstractHtmlExporter<HtmlReportConfiguration,HtmlExporterConfiguration> exporter = new HtmlExporter(); 

SimpleHtmlReportConfiguration htmlReportConfig = new SimpleHtmlReportConfiguration(); 

htmlReportConfig.setHyperlinkProducerFactory(HyperlinkExtensionsRegistryFactory.hyperlinkProducerFactory()); 

exporter.setConfiguration(htmlReportConfig); 

HyperlinkExtensionsRegistryFactory.hyperlinkProducerFactory()

public JRHyperlinkProducerFactory hyperlinkProducerFactory() { 
    JRHyperlinkProducerMapFactory producerFactory = new JRHyperlinkProducerMapFactory(); 
    producerFactory.addProducer("ReportExecution", new <Class_implements_JRHyperlinkProducer>()); 
    producerFactory.addProducer("Custom", new <Class_implements_JRHyperlinkProducer>()); 
    return producerFactory; 
}