Как использовать параметры jasper в пользовательском JRDataSource?

#java #jasper-reports #datasource

#java #jasper-отчеты #источник данных

Вопрос:

Я использую Jaspersoft Studio 6.11 с Jasper Server 7.5.0.

Я хочу создать источник данных, который использует параметры отчета. Мой источник данных основан на этом примере: https://community.jaspersoft.com/wiki/how-create-and-use-jrdatasource-adapter

 public class MyImplementation implements JRDataSource {

//This should be initialized from report parameter $P{param}= "Frank,Joseph,Marco,Carl,Lenny,Homer,Teodor,Leopold"
private static String param;   

private static String[] nameArray;

private static final Integer[] ageArray = {50,30,40,46,44,26,32,21};

private int counter = -1;

private HashMap<String, Integer> fieldsNumber = new HashMap<String, Integer>();

private int lastFieldsAdded = 0;

@Override
public boolean next() throws JRException {
    if (counter<nameArray.length-1) {
        counter  ;
        return true;
    }
    return false;
}

@Override
public Object getFieldValue(JRField jrField) throws JRException {
    Integer fieldIndex;
    if (fieldsNumber.containsKey(jrField.getName()))
        fieldIndex = fieldsNumber.get(jrField.getName());
    else {
        fieldsNumber.put(jrField.getName(), lastFieldsAdded);
        fieldIndex = lastFieldsAdded;
        lastFieldsAdded   ;
    }
    if (fieldIndex == 0) return nameArray[counter];
    else if (fieldIndex == 1) return ageArray[counter];
    return "";
}


public static JRDataSource getDataSource(){
    nameArray = param.split(",")
    return new MyImplementation();
}
}
 

String param должен быть инициализирован значением параметра отчета $ P {param}.
Как это сделать?
Как использовать параметры отчета в пользовательском источнике данных?

Ответ №1:

Наиболее распространенный способ сделать это — создать конструктор и передать в нем параметры.

Сначала удалите все ваши static модификаторы, потому что они вам не нужны, а также для того, чтобы вы могли выполнять несколько отчетов одновременно из разных потоков (даже если вы в настоящее время этого не делаете)

Ваш конструктор будет

 public MyImplementation(String param){
    this.param = param;
}
 

И когда вы используете его в jrxml, вы передаете параметр

 <dataSourceExpression>
    <![CDATA[new my.package.name.MyImplementation($P{param})]]>
</dataSourceExpression>