如何获得复杂JavaBean的价值

Pio*_*otr 5 java jasper-reports javabeans

我有一个.jrxml文件,我想从代码中传递一些参数.我有一个Orde具有像场R舱double price,int quantityProduct product.情况很简单,当我需要通过价格或数量时,我只是这样做:

<textFieldExpression class = "java.lang.Integer">
   <![CDATA[$F{quantity}]]>
</textFieldExpression>
Run Code Online (Sandbox Code Playgroud)

当我试图通过时出现问题product.getName().我尝试过类似的东西:

<textFieldExpression class = "java.lang.String">
   <![CDATA[$F{product}.getName()]]>
</textFieldExpression>
Run Code Online (Sandbox Code Playgroud)

还有很多其他人,但我一直在收到错误: net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 1. Field not found : product

你知道如何解决这个问题吗?

Ale*_*x K 3

例如,您有一对 JavaBean (POJO):

public class Order {

    private double price;
    private int quantity;
    private Product product;
    // public getters 
}

public class Product {

    private String name;
    // public getters 
}
Run Code Online (Sandbox Code Playgroud)

你以这样的方式声明报告的数据源:(是的,我喜欢Guava

JRBeanCollectionDataSource datasource = new JRBeanCollectionDataSource(Lists.newArrayList(ImmutableList.<Order>builder()
        .add(new Order(1000.2, 10, new Product("Phone")))
        .add(new Order(10200.0, 2, new Product("Tv")))
        .build()));
Run Code Online (Sandbox Code Playgroud)

如果使用此字段声明:

JRBeanCollectionDataSource datasource = new JRBeanCollectionDataSource(Lists.newArrayList(ImmutableList.<Order>builder()
        .add(new Order(1000.2, 10, new Product("Phone")))
        .add(new Order(10200.0, 2, new Product("Tv")))
        .build()));
Run Code Online (Sandbox Code Playgroud)

你可以使用这样的表达式:

<field name="order" class="java.lang.Object">
    <fieldDescription><![CDATA[_THIS]]></fieldDescription>
</field>
<field name="price" class="java.lang.Double"/>
<field name="quantity" class="java.lang.Integer"/>
<field name="productName" class="java.lang.String">
    <fieldDescription><![CDATA[product.name]]></fieldDescription>
</field>
Run Code Online (Sandbox Code Playgroud)

笔记: