groovy ObjectGraphBuilder从Java对象构建复杂对象而不是groovy对象

时间:2013-08-16 01:34:22

标签: groovy

我正在使用ObjectGraphBuilder来构建一个复杂的对象。有没有办法根据现有的java对象构建它,而不是groovy对象?感谢

更新8/16:这是不起作用的代码,以及我得到的异常。唯一的常规代码是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)

更新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')         

我注意到,如果你遍历数组,那么你在构建器中指定的最后一个员工最终将成为数组中的那个。

2 个答案:

答案 0 :(得分:2)

它应该与Groovy类一样好用Java类。 Groovy类最终被编译为字节代码为Java。所以不应该有任何问题。

请参阅groovy docs for ObjectGraphBuilder中的示例,了解它如何与POGO配合使用。将它们替换为项目中的POJO,您会看到相同的行为。

答案 1 :(得分:0)

证明你必须初始化列表。所以,如果你把

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')         

我注意到,如果你遍历数组,那么你在构建器中指定的最后一个员工最终将成为数组中的那个。

相关问题