【发布时间】:2016-03-14 07:35:24
【问题描述】:
我在类转换方面有点挣扎。让我设置场景。我有使用服务和编排器层的 java 服务器代码。请求以 bean 格式(与前端视图对齐的 java 类)进入服务层,然后我有一堆 domainBeanMapper 类,它们采用 bean 格式对象并将其转换为域格式对象。例如,UserBean 有一个由字符串表示的 dateOfBirth,而 User 有一个由 Date 表示的 dateOfBirth,因此 UserMapper.java 会将日期字符串转换为日期对象。因此,对于系统中的每个对象,我都有一个 *.java、*Bean.java 和 *Mapper.java(User.java、UserBean.java、userMapper.java)。
在 applicationContext 中,我保存每个对象与其映射器的关系,如下所示:
<util:map id="domainBeanMappers">
<entry key="UserBean" value-ref="userMapper" />
<entry key="User" value-ref="userMapper" />
.....
然后我定义映射器:
<bean id="userMapper" class="com.me.mapping.UserMapper" parent="baseDomainBeanMapper"/>
我从我的服务层这样调用域 bean 映射器:
UserBean userBean = (UserBean) getDomainBeanMapper().mapDomainToBean(user);
在运行这段代码时,我找到了我想要的映射器对象,如下所示:
DomainBeanMapper mapper = findApplicableMapper(myObject.getClass().getName());
if (mapper == null) {
mapper = findApplicableMapper(myObject.getClass().getSimpleName());
}
findApplicableMapper 的工作方式如下:
private DomainBeanMapper findApplicableMapper(String string) {
return domainBeanMappers.get(string);
}
在过去的几年里,这就像一个魅力。对于系统中我想要的任何对象,我可以轻松地挑选出相关的映射器,然后根据任何实例的 .getClass() 调用从我的 bean 格式转换为域格式,反之亦然。
现在,我有一个新要求给我带来了麻烦。我希望能够根据参数从我的用户对象转换为多个子对象。所以对于一些电话,我只想要 id、firstName 和 lastName 回来。对于其他调用,我想要更多字段,但仍然不是整个对象,然后对于某些调用,我希望整个对象像以前一样返回。我不想沿着子对象的路径走下去,最终得到 UserLight、UserLightWithName、UserLightWithNameButNoAddress,……啊,噩梦。
因此,我希望创建一堆代表“视图”的接口。所以请求带有 Basic 的 ViewType,这意味着我想要用户的个人详细信息和地址。于是我写了一个叫 UserBasic 的接口,让 User 实现它,并添加了从 UserBasic 到 UserBasicMapper,从 UserBasicBean 到 UserBasicMapper 的映射,希望我可以像这样进行翻译调用:
UserBasicBean restrictedUserReturn = (UserBasicBean) getDomainBeanMapper().mapDomainToBean((UserBasic)user);
但这不起作用,因为 getClass() 总是返回实例类,而不是它被转换到的接口。我想我总是可以在 mapDomainToBean 调用中添加另一个参数,这是我想要使用的类,但是代码库非常庞大,如果我进行更改,我将需要处理每个调用。
所以基本上我正在寻找一种将实例转换为接口类型然后找到该接口类型的方法?这可能吗??
交叉手指...
【问题讨论】:
-
为什么不想要整个对象?
-
这是一项安全要求。系统的某些用户只能看到对象的某些部分。