2014-12-10 2 views
1

Я передаю параметр Джасперу, который представляет собой набор карт. Я хотел бы использовать эту коллекцию в качестве набора данных для таблицы.Как использовать карту как элемент набора данных в JasperReports?

Если бы я имел коллекцию обычных объектов Java я хотел бы сделать:

$F{description} 

, чтобы получить поле. Я хотел бы сделать что-то вроде:

get(description) 

или

values().get(1) 

Можно ли получить значение карты в виде таблицы, как это?

ответ

0

Как я действительно хотел сохранить общий сервис, я решил создать динамическое создание класса с помощью Javassist. Это уродливое решение, но по крайней мере оно работает.

HashMap<String, Object> element = (HashMap<String, Object>) ((ArrayCollection) v).get(0); 
    ClassPool pool = ClassPool.getDefault(); 
    CtClass ctClass = pool.makeClass("Dynamic"+System.currentTimeMillis()); 
    element.keySet().forEach(s -> { 
    try { 
    //need only Strings 
    ctClass.addField(CtField.make("public String "+s+";", ctClass)); 
    ctClass.addMethod(CtMethod.make("public String get" + StringUtils.capitalize(s) + "() { return " + s + "; }", ctClass)); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       }); 
    Class clazz = ctClass.toClass(); 
    ArrayList<Object> objects = new ArrayList<>(); 
    ((Collection) v).forEach(m -> { 
     HashMap<String, Object> hm = (HashMap<String, Object>) m; 
     try { 
      Object obj = clazz.newInstance(); 
      element.keySet().forEach(s -> { 
       try { 
        obj.getClass().getDeclaredField(s).set(obj, hm.get(s)); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      }); 
     objects.add(obj); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    }); 
    parameters.put(k, new JRBeanCollectionDataSource(objects)); 
Смежные вопросы