`
yonglin4605
  • 浏览: 187619 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

VO与PO的相互转换

    博客分类:
  • GWT
阅读更多
GWT中的RPC机制可以让我们在前台页面直接调用后台的servlet,而且还能在前台就封装成一个对象,调用后台的方法,免去了中间的拆装。

但是一般前台展示用的是VO,而后台程序用的是PO,2者之间的转换还是有些麻烦,要写很多get set方法,很不利与整个程序的模块化与扩展性。

以下是我的一个方案,暂时感觉还不错。

写一个注解,通过这个注解来绑定VO与PO
package com.single.annotation;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.single.onlineoffice.main.server.convert.Convert;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BindConvert {

	@SuppressWarnings("unchecked")
	Class<? extends Convert> convert();
	
}


写一个转换接口Convert
package com.single.convert;

import java.util.Collection;

public interface Convert<DOMAIN,CLIENT> {

	public CLIENT convertToClient(DOMAIN domain,Object... params);
	
	public DOMAIN convertToDomain(CLIENT client,Object... params);
	
	public Collection<CLIENT> convertCollectionToClient(Collection<DOMAIN> domains,Object... params);
	
	public Collection<DOMAIN> convertCollectionToDomain(Collection<CLIENT> clients,Object... params);
}

下面是Employee这个PO
package com.single.domain;

import com.single.annotation.BindConvert;
import com.single.onlineoffice.main.server.convert.EmployeeConvert;


@BindConvert(convert=EmployeeConvert.class)
public class Employee {

	private Long id;

	private String name;

	private Account account;
}

下面是ClientEmployee这个VO,与PO的差别是有一个username,他只是account中的一个属性
package com.single.domain;

import java.io.Serializable;

import com.single.annotation.BindConvert;
import com.single.onlineoffice.main.server.convert.EmployeeConvert;

@BindConvert(convert=EmployeeConvert.class)
public class ClientEmployee implements Serializable{

	private Long id;
	private String name;
	private String username;
}



下面是Employee与ClientEmployee之间的转换器
package com.single.onlineoffice.main.server.convert;

import java.util.Collection;
import com.single.onlineoffice.main.client.domain.ClientEmployee;
import com.single.onlineoffice.main.server.domain.Employee;

public class EmployeeConvert implements Convert<Employee, ClientEmployee> {
	@Override
	public ClientEmployee convertToClient(Employee domain,Object... params) {
		ClientEmployee clientEmployee=new ClientEmployee();
		clientEmployee.setId(domain.getId());
		clientEmployee.setName(domain.getName());
		clientEmployee.setUsername(domain.getAccount().getUsername());
		return clientEmployee;
	}

	@Override
	public Employee convertToDomain(ClientEmployee client,Object... params) {
		Employee employee=new Employee();
		employee.setId(client.getId());
		employee.setName(client.getName());
		return employee;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Collection<ClientEmployee> convertCollectionToClient(
			Collection<Employee> domains, Object... params) {
		Collection<ClientEmployee> collection=null;
		try {
			collection=domains.getClass().newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("创建集合对象出错");
		}
		for(Employee employee:domains){
			collection.add(convertToClient(employee, params));
		}
		
		return collection;
	}

	@SuppressWarnings("unchecked")
	@Override
	public Collection<Employee> convertCollectionToDomain(
			Collection<ClientEmployee> clients, Object... params) {
		Collection<Employee> collection=null;
		try {
			collection=clients.getClass().newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("创建集合对象出错");
		}
		for(ClientEmployee clientEmployee:clients){
			collection.add(convertToDomain(clientEmployee, params));
		}
		return collection;
	}

}



再写一个辅助类就可以轻松的进行转换了
package com.single.onlineoffice.main.server.util;

import com.single.annotation.BindConvert;
import com.single.onlineoffice.main.server.convert.Convert;

public class DomainClientConvertUtils {

	@SuppressWarnings("unchecked")
	public static <X>X convertToClient(Object object,Object... params) {
		BindConvert anno=object.getClass().getAnnotation(BindConvert.class);
		Convert<Object, Object> convert=null;
		try {
			convert=anno.convert().newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Domain转换Client异常");
		}
		return (X)convert.convertToClient(object,params);
	}
	
	@SuppressWarnings("unchecked")
	public static <X>X convertToDomain(Object object,Object... params) {
		BindConvert anno=object.getClass().getAnnotation(BindConvert.class);
		Convert<Object, Object> convert=null;
		try {
			convert=anno.convert().newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Client转换Domain异常");
		}
		return (X)convert.convertToDomain(object,params);
	}
}



如果需要转换,使用以下语句就可以了
		Employee employee=null;
		ClientEmployee ce=DomainClientConvertUtils.convertToClient(employee);
		
		ClientEmployee clientEmployee=null;
		Employee e=DomainClientConvertUtils.convertToDomain(clientEmployee);
分享到:
评论

相关推荐

    java的几种对象(PO_VO_DAO_BO_POJO)解释

    在实体框架或ORM(对象关系映射)工具中,PO对象作为桥梁,将Java对象与数据库记录相互转换,使得开发者能够以面向对象的方式操作数据库数据。 ### 值对象(VO) 值对象(VO)是一种无状态的对象,它代表了一组值...

    java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    POJO、DTO、VO 等都是 Java 中常用的类别,但是它们之间的转换却是一件复杂的事情,需要我们对 Java 的反射机制、泛型、基本类型等有深入的了解。 首先,我们需要了解什么是 POJO、DTO、VO。POJO 是 Plain Ordinary...

    java中的缩写

    POJO常被用作VO或BO的基础,它们可以轻易地转换为其他类型的对象,如PO或VO,这使得它们成为构建复杂应用的基石。 ### 关系与应用场景 这些概念并非孤立存在,它们之间存在着紧密的联系和相互转化的过程。例如,PO...

    hibernate配置要点详谈

    - VO与PO之间的相互转换可以使用`BeanUtils.copyProperties()`方法实现。 #### 十、延迟加载与非延迟加载 - **延迟加载**: - 如果采用了延迟加载机制但希望在某些情况下实现非延迟加载,可以通过`Hibernate....

    SSH详细简介

    Action接受用户的数据,Action将数据从Action中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再forward。而业务层Bean收到这个PO对象之后,会调用DAO接口方法,进行持久化操作。 SSH框架是由...

    pic变压器常用规格书

    这不仅涵盖了输入电压范围、输出电压、电流密度、电感等关键指标,还涉及了设计过程中考虑的各种物理量之间的相互关系和计算方法。 ### 一、基本设计参数 #### 输入电压范围 输入电压范围设定为90VAC到264VAC,这...

    浅谈Action+Service +Dao 功能

    数据的流向是:ActionFormBean接受用户的数据,Action将数据从ActionFormBean中取出,封装成VO或PO,再调用业务层的Bean类,完成各种业务处理后再Forward。 4. SSH框架的优点 Hibernate的最大好处就是根据数据库的...

    Java编码辅助工具Mapstruct用法详解

    在项目开发中,业务分层会涉及不同类型的Bean之间需要相互转换,如PO与DTO之间,PO与VO之间等。手动编码setter/getter各个对应属性,会显得臃肿繁琐。通过Mapstruct框架可简单方便地完成这一工作。 如何引入Map...

    vsked领域驱动设计1

    例如,PO(Persistent Object)层就是用于将领域对象转化为数据库中的持久化对象,如ORM(对象关系映射)框架。视图对象(View Object,如VO)则是用于在展示层中传递数据的对象,它们通常用于界面渲染。 分层架构...

    阿里云java规范

    1. **解析**:对象关系映射(ORM)是一种将对象模型与数据库模型相互转换的技术。这部分内容提供了关于如何正确使用ORM框架的指导,以提高开发效率和代码质量。 #### 六、工程结构 1. **解析**:工程结构部分主要...

Global site tag (gtag.js) - Google Analytics