gpt4 book ai didi

spring - 推土机自定义转换器ID映射: Object to Long and Long to Object via DozerConverter getParameter

转载 作者:行者123 更新时间:2023-12-04 20:57:04 24 4
gpt4 key购买 nike

我需要帮助配置我的推土机映射文件。

主要是我想知道如何让用户用户对象转换为长用户ID。
因此映射:用户>>用户ID
但是我有多个对象,例如评论>>commentId 或地址>> addressId

因此,我想要一些比为每个字段编写映射更优雅的东西。所有的对象都实现了 Loadable 接口(interface)。

由于 getParameter() DozerConverter 方法,下面的代码现在可以运行,但是如果您知道比我编写的转换器更好的方法,请告诉我。

//推土机.xml

<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net http://dozer.sourceforge.net/schema/beanmapping.xsd">

<configuration>
<custom-converters>
<converter type="project.shared.domain.dto.dozer.LoadableIdConverter" >
<class-a>project.shared.domain.Loadable</class-a>
<class-b>java.lang.Long</class-b>
</converter>
</custom-converters>
</configuration>

<mapping>
<class-a>project.shared.domain.Suggestion</class-a>
<class-b>project.shared.domain.dto.DTOSuggestion</class-b>
<field custom-converter-param="User">
<a>user</a>
<b>userId</b>
</field>
</mapping>

</mappings>\

//Spring 应用程序上下文
<bean id="loadableIdConverter" class="project.shared.domain.dto.dozer.LoadableIdConverter">
<property name="userService" ref="userService"/>
<property name="commentService" ref="commentService"/>
<property name="addressService" ref="addressService"/>
</bean>
<bean id="gwtMapper" class="org.dozer.DozerBeanMapper">
<property name="mappingFiles">
<list>
<value>classpath:/dozer.xml</value>
</list>
</property>

<property name="customConverters">
<list>
<ref bean="loadableIdConverter"/>
</list>
</property>
</bean>

//标准休眠对象
public class Suggestion implements Serializable, Loadable {
private long id = -1;
private Date dateCreated;

private User user; //trying to use dozer to covert this bad boy to Long userId
//...
}

//DTO 对象
public class DTOSuggestion implements IsSerializable {
private long id = -1;
private Date dateCreated;

private Long userId; //trying to get this ID via the dozer converter
//...
}

//可加载接口(interface)
public interface Loadable extends Serializable {
public long getId();
public void setId(long id);
}

//推土机转换器
public class LoadableIdConverter extends DozerConverter<Loadable, Long> {

private UserService userService; //configured in applicationcontext
private AddressService addressService; //configured in applicationcontext
private CommentService commentService; //configured in applicationcontext

public LoadableIdConverter() {
super(Loadable.class, Long.class);
}

public Long convertTo(Loadable object, Long id) {
return object.getId();
}

public Loadable convertFrom(Long id, Loadable object) {
if (id < 0) return null;

String loadable = getParameter();
if (loadable.equalsIgnoreCase("User"))
return userService.get(User.class, id);
if (loadable.equalsIgnoreCase("Address"))
return addressService.get(Address.class, id);
if (loadable.equalsIgnoreCase("Comment"))
return commentService.get(Comment.class, id);
return null;
}
}

最佳答案

您可以使用一种技巧来避免转换器参数。如果您回退到 Dozer 中实现 CustomConverter 接口(interface)的旧自定义转换器方法,您将获得两个附加参数:existingDestinationValue 和 destinationClass。

convert(Object existingDestinationFieldValue, Object sourceFieldValue, Class<?> destinationClass, Class<?> sourceClass) 

通过使用这些值,您可以通过反射反省您的目标字段,并了解 Loadable 接口(interface)的预期具体实现是什么。当然,这仅在您使用具体类型定义字段类型时才有效。但是您的示例中已经有了它,所以这应该不是问题。 CustomConverter 实现将更加冗长,因为您需要手动确定映射的方向,但它可以让您完全控制映射过程中发生的事情。

关于spring - 推土机自定义转换器ID映射: Object to Long and Long to Object via DozerConverter getParameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4390178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com