gpt4 book ai didi

java - 具有通用服务的 Spring Boot 映射器

转载 作者:行者123 更新时间:2023-12-02 09:17:39 25 4
gpt4 key购买 nike

我正在尝试使用Java框架Spring Boot构建通用架构。

我尝试过的映射器似乎没有像 .Net Core 框架中的 Automapper 那样的通用方法 -> Mapper.Map<TEntity>(source) .

Is there a way to achieve in Spring Boot generic mapping without passing a target? Because my target is TEntity and it couldn't be directly instantiated (T target = new T();) to pass it directly in method (mapper.map(source, target)).

有一个我想在服务层的.Net Core框架中用C#实现的示例。

public virtual TDataTransferObject Insert(TInsertDTO request){
var entity = Mapper.Map<TEntity>(request);
return Mapper.Map<TDataTransferObject>(Repository.Add(entity));
}

最佳答案

我的经验主要是使用ModelMapper它仅在两个对象之间映射或从一个对象映射到目标类。

快速浏览其他热门mappers ,它们在这方面提供了类似的功能,可能是因为 Type erasure在Java中。

要解决该限制,泛型类的类型应作为字段添加到基类中。一种解决方案是将其作为参数传递给基类的构造函数。另一种是使用反射:

public abstract class BaseService<E> {

private final Class<E> entityClass;
private final ModelMapper mapper;

protected BaseService(ModelMapper mapper) {
this.mapper = mapper;
entityClass = getEntityClass();
}

@SuppressWarnings("unchecked")
private Class<E> getEntityClass() {
return (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
}

public <I, O> O insert(I inputData, Class<O> outClass) {
E entity = mapper.map(inputData, entityClass);
O outData = mapper.map(entity, outClass);
return outData;
}
}


public class FooService extends BaseService<Foo> {

public FooService(ModelMapper mapper) {
super(mapper);
}
}

public class Demo {

public static void main(String[] args) {
FooService service = new FooService(new ModelMapper());

Foo foo = new Foo("foo");
Baz baz = service.insert(foo, Baz.class);
}
}

Live demo

一篇比较 Performance of Java Mapping Frameworks 的文章

关于java - 具有通用服务的 Spring Boot 映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58886426/

25 4 0