私は ObjectGraphBuilder を使用して複雑なオブジェクトを構築しています。Groovyオブジェクトではなく、既存のJavaオブジェクトに基づいて構築する方法はありますか? ありがとう
8/16 更新: 動作しないコードと例外が表示されます。Groovy コードは MyMain.groovy だけです。それ以外はすべて Java です。
public class Company {
private String name;
private Address address;
private List<Employee> employees;
//getters and setters
}
public class Employee {
private String name;
private int employeeId;
//getters and setters
}
public class Address {
private String line1;
private String line2;
private int zip;
private String state;
//getters and setters
}
class MyMain {
def company
Company createCompany() {
def builder = new ObjectGraphBuilder()
company = builder.company(name: 'ACME'){
address(line1: '32 fifth st', line2: 'apt 423')
3.times {
employee(employeeId: 20, name: 'joe smith')
}
}
}
}
public class Blah {
public static void main(String[] args) {
MyMain myMain = new MyMain();
Company c = myMain.createCompany();
System.out.println(c.getName());
System.out.println(c.getAddress().getLine1());
System.out.println(c.getAddress().getLine2());
System.out.println("tot # of employees " + c.getEmployees().size());
}
}
Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Employee@152441a' with class 'Employee' to class 'java.util.List'
at org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:360)
at groovy.lang.MetaClassImpl.setProperty(MetaClassImpl.java:2465)
at groovy.lang.MetaClassImpl.setProperty(MetaClassImpl.java:3412)
at org.codehaus.groovy.runtime.InvokerHelper.setProperty(InvokerHelper.java:196)
UPDATE 2
では、リストを初期化する必要があることがわかりました。だから、あなたが置くなら
private List<Employee> employees = new ArrayList<Employee>();
その後、それは動作します。配列の場合はどうですか?空の配列を作成しようとしましたが、うまくいきませんでした。例外なく実行されますが、ビルダーに含まれる従業員ステートメントの数に関係なく、配列のサイズは 1 になります。
employee(employeeId: 20, name: 'joe smith')
employee(employeeId: 10, name: 'geno smith')
employee(employeeId: 80, name: 'your mom')
配列を反復すると、ビルダーで指定した最後の従業員が配列内の従業員になることに気付きました。