Java 如何使用不同的输入对象在同一业务对象中映射?

Java 如何使用不同的输入对象在同一业务对象中映射?,java,algorithm,jakarta-ee,design-patterns,Java,Algorithm,Jakarta Ee,Design Patterns,现在在我的应用程序中输入来自数据库的数据(城市数据)。 我按照以下程序处理输入。 -从数据库读取数据并创建CityDTO对象(Class=CityDTO) -将DTO映射到业务对象(CityBO) 但现在,客户端将使用webservice发送带有Json文件的城市数据。 现在我有了CityJson对象(Class=CityJson),我想将CityJson映射到CityBO 请参阅下面的代码片段以了解: *****数据库或DTO对象***** Public Class CityDTO {

现在在我的应用程序中输入来自数据库的数据(城市数据)。 我按照以下程序处理输入。 -从数据库读取数据并创建CityDTO对象(Class=CityDTO) -将DTO映射到业务对象(CityBO)

但现在,客户端将使用webservice发送带有Json文件的城市数据。 现在我有了CityJson对象(Class=CityJson),我想将CityJson映射到CityBO

请参阅下面的代码片段以了解:

*****数据库或DTO对象*****

Public Class CityDTO {
    Public String name;
    public <List>AreaDTO;
}
Public Class AreaDTO {
    Public String name;
    public String zipcode;
}
Public Class CityBO{
    Public String name;
    public <List>AreaBO;
}
Public Class AreaBO{
    Public String name;
    public String zipcode;
}
CityDTO公共类{
公共字符串名称;
公共区域;
}
公共类区域{
公共字符串名称;
公共字符串zipcode;
}
*****业务或域对象*****

Public Class CityDTO {
    Public String name;
    public <List>AreaDTO;
}
Public Class AreaDTO {
    Public String name;
    public String zipcode;
}
Public Class CityBO{
    Public String name;
    public <List>AreaBO;
}
Public Class AreaBO{
    Public String name;
    public String zipcode;
}
CityBO公共类{
公共字符串名称;
公共区域;
}
公共类AreaBO{
公共字符串名称;
公共字符串zipcode;
}
*****CycleDTO到CycleBO的映射*****

Class DBmapper {
    public void CityBO mapToCityBO(CityDTO citydto){
        CityBO citybo =  new cityBO();
        citybo.setName(citydto.getName);
        citybo.setAreaBO(mapAreaBO(citydto.getAreaDTO));
    }

    public List<AreaBO>mapAreaBO(List<AreaBO> listOfAreadto){
        List<AreaBO> listOfAreaBO = new ArrayList<AreaBO>
        for(AreaDTO areadto : listOfAreadto){
            AreaBO areaBO = new AreaBO();
            areaBO.setName(areadto.getname());
            areaBO.setZipCode(areadto.getZipCode());
        }
    }
}
类DBmapper{ 公共无效城市BO映射到城市BO(城市到城市到城市到){ CityBO CityBO=新的CityBO(); citybo.setName(citydto.getName); citybo.setAreaBO(mapAreaBO(citydto.getAreaDTO)); } 公共列表MapAreabo(列表列表ReadTo){ List listOfAreaBO=新阵列列表 用于(区域到区域到:列表){ AreaBO AreaBO=新AreaBO(); setName(areadto.getname()); areaBO.setZipCode(areadto.getZipCode()); } } } 现在我有了CityJson类/对象,我想将CityJson对象映射到CityBO对象 将来,我可能会有CityXML对象,它需要再次映射到CityBO

两个或多个不同的输入对象,并希望映射到同一业务对象中。
如何实现这一点,以便将来客户端添加更多输入类型时,必须维护我的应用程序代码。

策略模式的简单应用程序应该有助于扩展性

定义一个抽象和通用的策略:

public interface Mapper<T> { 
    CityBO from(T original);
}
公共接口映射程序{
城巴发自(T正本);;
}
具体策略实例化类型参数并进行转换:

public class FromDtoMapper implements Mapper<CityDTO> {
    public CityBO from(CityDTO original) {
        /* convert original and return the new CityBO */
    }
}

class FromJsonMapper implements Mapper<CityJson> {
    public CityBO from(CityJson original) {
        /* convert original and return the new CityBO */
    }
}
来自DTomapper的公共类实现映射器{ 公共城市广播从(城市广播到原件){ /*转换原始版本并返回新的CityBO*/ } } 类FromJsonMapper实现映射器{ 公共城市运营商来源(CityJson原件){ /*转换原始版本并返回新的CityBO*/ } } 然后,无论您需要在哪里进行转换,都可以实例化/注入所需的策略。例如:

Mapper<CityDTO> mapper = new FromDtoMapper();
// stuff happens
CityBO city = mapper.from(new CityDTO());
Mapper Mapper=newfromdtomapper();
//事情发生了
CityBO city=mapper.from(new CityDTO());
然后,在输入类型之间切换只是切换策略的问题


为简单起见,此代码假设到
AreaBO
的转换可以在不使用
CityBO
的情况下进行封装。如果没有,那只是扩展接口的问题。

策略模式的一个简单应用程序应该有助于提高可扩展性

定义一个抽象和通用的策略:

public interface Mapper<T> { 
    CityBO from(T original);
}
公共接口映射程序{
城巴发自(T正本);;
}
具体策略实例化类型参数并进行转换:

public class FromDtoMapper implements Mapper<CityDTO> {
    public CityBO from(CityDTO original) {
        /* convert original and return the new CityBO */
    }
}

class FromJsonMapper implements Mapper<CityJson> {
    public CityBO from(CityJson original) {
        /* convert original and return the new CityBO */
    }
}
来自DTomapper的公共类实现映射器{ 公共城市广播从(城市广播到原件){ /*转换原始版本并返回新的CityBO*/ } } 类FromJsonMapper实现映射器{ 公共城市运营商来源(CityJson原件){ /*转换原始版本并返回新的CityBO*/ } } 然后,无论您需要在哪里进行转换,都可以实例化/注入所需的策略。例如:

Mapper<CityDTO> mapper = new FromDtoMapper();
// stuff happens
CityBO city = mapper.from(new CityDTO());
Mapper Mapper=newfromdtomapper();
//事情发生了
CityBO city=mapper.from(new CityDTO());
然后,在输入类型之间切换只是切换策略的问题


为简单起见,此代码假设到
AreaBO
的转换可以在不使用
CityBO
的情况下进行封装。如果不是,那只是扩展接口的问题。

DTO是一个概念,而Json、Xml、二进制等是通信的序列化方面,不知何故是一个细节。一种简单的方法是创建DTO类,然后针对每种不同类型的序列化,将接收到的数据转换为DTO对象,然后将DTO对象转换为BO。

DTO是一个概念,而Json、Xml、二进制等是通信的序列化方面,在某种程度上是一个细节。一种简单的方法是创建DTO类,然后针对每种不同类型的序列化,将接收到的数据转换为DTO对象,然后将DTO对象转换为BO。

您不需要手动将持久性实体映射到DTO,反之亦然。有很多方法可以用来完成它。例如,我建议您看看,它是基于注释的,作为Maven注释处理器工作。它在CDI和基于Spring的应用程序中集成了


您还可以考虑生成GETTER、SETTER、<代码>均衡器()/代码>、<代码> HASCODE()/<代码>和<代码> toSTRIN()/<代码>方法。

< P>您不需要将持久性实体映射到DTOs,反之亦然。有很多方法可以用来完成它。例如,我建议您看看,它是基于注释的,作为Maven注释处理器工作。它在CDI和基于Spring的应用程序中集成了


您还可以考虑生成GETTER、SETTER、<代码>均衡器()/代码>、<代码> HASCODE()/<代码>和<代码> toStrug()/<代码>方法。< /P>也许您可以使用适配器模式。尚不清楚是否需要

CityJSon
。json解析器应该能够重用现有的
CityDTO
类。更新您的问题,添加一些代码来帮助澄清问题。感谢您的回复,目前我们在cityJson中与CityToMaybe相比有一点变化