转换java对象的框架

Zal*_*aka 11 java persistence dto

我正在研究将数据库实体转换为DTO对象的项目.为此,每个转换使用一个特殊的转换器类.


我正在提供我们正在做的事情的简化示例.我故意错过了setter/getters和其他一些代码清晰度的东西.

所以这里是持久性实体:

class Car {
    String number;
    Driver driver;
}

class Driver {
    String name;
    License license;
}

class License {
    String serial;
    Date expired;
} 
Run Code Online (Sandbox Code Playgroud)

并假设我们需要遵循DTO对象:

class DriverDTO {
    String name;
    String carNumber;
    String licenseSerial;
}
Run Code Online (Sandbox Code Playgroud)

我们创建以下转换器类:

class DriverDTOConverter {
    DriverDTO convert(Car car) {
        DriverDTO driverDto = new DriverDTO();
        driverDto.carNumber = car.number;
        driverDto.name = car.driver.name;
        driverDto.licenseSerial = car.driver.license.serial;
        return driverDto;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个更复杂的例子:

class CarDTO {
    String number;
    String driverName;
    LicenseDTO driverLicense;
}

class LicenseDTO {
    String serial;
}

class CarDTOConverter {
    CarDTO convert(Car car) {
        CarDTO carDto = new CarDTO();
        carDto.number = car.number;
        carDto.driverName = car.driver.name;
        LicenseDtoConverter c = new LicenseDtoConverter();
        carDto.driverLicense = c.convert(car.driver.license);
        return carDto;
    }
}

class LicenseDtoConverter {
    LicenseDTO convert(License license) {
        LicenseDTO licenseDto = new LicenseDTO();
        licenseDto.serial = license.serial;
        return licenseDto;
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要花费很多时间,所以我想知道是否有任何框架可以承担这项工作的责任.我只需要用属性文件或注释配置它.

像这样的Smth

如果由属性文件制作:

DriverDto <--> Car {
carNumber = number;
name = driver.name;            
licenseSerial = driver.license.serial;
}

CarDTO <--> Car {
number = number;
driverName = driver.name;
driverLicense = driver.license;
}

LicenseDTO <--> License {
license = license;
}
Run Code Online (Sandbox Code Playgroud)

或者可能带注释的实体的示例

@Converted(Car.class)
class DriverDTO {
    @Associated("driver.name")
    String name;
    @Associated("number")
    String carNumber;
    @Associated("driver.license.serial")
    String licenseSerial;
}
Run Code Online (Sandbox Code Playgroud)

重要的要求是它不应该使用任何反射.应在编译或预编译阶段编译所有注释或属性文件,并应生成字节码或源代码.

如果有人能指出我这样的框架,我将非常高兴.如果它仍处于开发阶段,我也将很乐意参与其创作.

Biv*_*vas 5

您应该查看Dozer - Java bean到bean映射器.易于使用,易于扩展.