用于转换java对象的框架

用于转换java对象的框架,java,persistence,dto,Java,Persistence,Dto,我正在从事将数据库实体转换为DTO对象的项目。为此,每个转换都使用一个特殊的转换器类 我提供了我们正在做的事情的简化示例。为了代码清晰,我故意忽略了setter/getter和其他一些东西 下面是持久性实体: class Car { String number; Driver driver; } class Driver { String name; License license; } class License { String serial;

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


我提供了我们正在做的事情的简化示例。为了代码清晰,我故意忽略了setter/getter和其他一些东西

下面是持久性实体:

class Car {
    String number;
    Driver driver;
}

class Driver {
    String name;
    License license;
}

class License {
    String serial;
    Date expired;
} 

假设我们需要以下DTO对象:

class DriverDTO {
    String name;
    String carNumber;
    String licenseSerial;
}
我们创建以下转换器类:

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;
    }
}

还有一个更复杂的例子:

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;
    }
}

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

是这样吗

如果由属性文件生成:

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;
}
重要的要求是,它不应该使用任何反射。所有注释或属性文件都应在编译或预编译阶段编译,并应生成字节码或源代码

如果有人能给我指出这样一个框架,我将非常高兴。如果它仍然在developent上,我也将很乐意参与它的创建。

您应该查看-javabean-to-bean映射器。易于使用,易于扩展。

您可以查看

它与Dozer和其他产品的不同之处在于,它通过智能映射对象模型将所需的配置量降至最低。在需要配置的地方,ModelMapper提供了一个重构安全API,它使用实际代码映射属性和值,而不是使用字符串引用或XML

有关更多信息,请访问ModelMapper网站:


dozer的另一个替代方案是jDTO Binder,您可能会发现它很有趣,它使用起来非常简单,并且提供了与最流行的后端容器的集成


您可能会感兴趣的是,哪一个编译时代码生成器正好适用于此用例(免责声明:我正在处理此项目)

由于MapStruct是一个构建时工具,它既不使用反射,也不需要运行时依赖项。您需要声明一个如下所示的接口:

@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper ( CarMapper.class );

    @Mapping(source="number", target="carNumber")
    @Mapping(source="driver.name", target="name")
    @Mapping(source="driver.license.serial", target="licenseSerial")
    CarDto carToCarDto(Car car);

    DriverDto driverToDriverDto(Driver driver);
}
在构建过程中(例如,通过Maven或在IDE中),MapStruct将生成该接口的一个实现,该接口基本上看起来像您原始的手写代码


如果您感兴趣,可以在中找到更多信息。

Thx我已经对它进行了第一次查看。如果我们不考虑它使用反射,这就是我想要的东西。无论如何,我认为答案是正确的。如果有人能建议一个更强大的框架,我会很高兴,并将改变我的“正确”答案的选择。这对同样对这个问题感兴趣的人来说是有帮助的。
@Mapper
public interface CarMapper {

    CarMapper INSTANCE = Mappers.getMapper ( CarMapper.class );

    @Mapping(source="number", target="carNumber")
    @Mapping(source="driver.name", target="name")
    @Mapping(source="driver.license.serial", target="licenseSerial")
    CarDto carToCarDto(Car car);

    DriverDto driverToDriverDto(Driver driver);
}