标签: modelmapper

ModelMapper:将集合映射到其他结构的集合

我将业务对象映射到实体,并且在某些情况下实体的结构与业务对象不同。
我将userCategories它们作为字符串存储在业务对象中RecipeBo,因为 BO 不需要了解有关实体的内部结构的任何信息。这些字符串需要映射到Recipe和的关系RecipeUserCategoryRel,除此之外,另一个字段userIdRecipeBo需要映射到其中RecipeUserCategoryRel

我的方法(有效)是创建一个包装器并手动创建关系,但这看起来像是修补:

public class BoMapper
{
    private final static ModelMapper modelMapper = new ModelMapper();

    static
    {
        modelMapper.addMappings(new IngredientMap());
    }

    public static void map(Object from, Object to)
    {
        modelMapper.map(from, to);

        if (from instanceof RecipeBo && to instanceof Recipe)
        {
            RecipeBo recipeBo = (RecipeBo)from;
            List<String> userCategories = recipeBo.getUserCategories();
            List<RecipeUserCategoryRel> recipeUserCategoryRels = new ArrayList<>();

            for (String userCategory : userCategories)
            {
                recipeUserCategoryRels.add(new RecipeUserCategoryRel(userCategory, recipeBo.getUserId()));
            }

            Recipe recipe …
Run Code Online (Sandbox Code Playgroud)

java mapping modelmapper

5
推荐指数
1
解决办法
8213
查看次数

如何在模型映射器转换器中使用泛型

我正在尝试使用 aConverter来指定 DTO 中的简单字符串字段到作为TypedString另一个复杂对象一部分的 -Object的映射。问题是,这TypedString是多个实现的接口。如果我使用特定的实现,这样的转换器就可以工作,但如果我在运行时使用泛型来定义类型(见下文),则不能工作。在这种情况下,当我调用modelmapper.map().

这不适合我,因为我必须为每个实现编写转换器。

是否可以使用泛型在运行时定义目标类型?

PS:电流转换器通过反射创建一个实例,它有效!

谢谢。

此代码有效

import org.modelmapper.Converter;
import org.modelmapper.ModelMapper;
import org.modelmapper.spi.MappingContext;

public class MyModelMapper extends ModelMapper {

  public MyModelMapper() {

    super();

    Converter<?, ?> converter = new Converter<String, ParticularDestType>() {

        @Override
        public SupplierId convert(MappingContext<String, ParticularDestType> context) {

            return (ParticularDestType) TypedStringConverter.createNewInstanceFromValue(context
                    .getSource(), ParticularDestType.class);
        }
    };

    addConverter(converter);
  }
}

@AllArgsConstructor
public class ParticularDestType implements TypedString {

  private String value;

}    
Run Code Online (Sandbox Code Playgroud)

但是,如果我将其添加到MyModelMapper(即addConverter(new ModelMapperTypedStringConverter<ParticularDestType>()))中,这将不起作用!!!

import org.modelmapper.Converter;
import org.modelmapper.spi.MappingContext; …
Run Code Online (Sandbox Code Playgroud)

java modelmapper

5
推荐指数
0
解决办法
1534
查看次数

模型映射器空值跳过

Class A {
    private String a;
    private String b;
    private B innerObject;
}
Class B {
    private String c;
}
Run Code Online (Sandbox Code Playgroud)

就我而言,字符串 b 可能带有空值。我的模型映射器配置如下:

ModelMapper mapper = new ModelMapper();
    mapper.getConfiguration()
    .setFieldMatchingEnabled(true)
    .setMatchingStrategy(MatchingStrategies.LOOSE)
    .setFieldAccessLevel(AccessLevel.PRIVATE)
    .setSkipNullEnabled(true)
    .setSourceNamingConvention(NamingConventions.JAVABEANS_MUTATOR);
Run Code Online (Sandbox Code Playgroud)

当我映射对象时,我得到 b=null 值的目标对象。

试图远离此处显示的策略:SO-问题

我错过了什么?

java null modelmapper

5
推荐指数
2
解决办法
1万
查看次数

DateConverter 无法将 java.lang.String 转换为 java.util.Date。引起:org.modelmapper.MappingException:ModelMapper 映射错误:

我正在尝试使用 modelmapper 将我的类与传入的请求进行映射。

看起来 Date 无法在 modelmapper 中自动转换。

转换器 org.modelmapper.internal.converter.DateConverter@7595415b 未能将 java.lang.String 转换为 java.util.Date。引起:org.modelmapper.MappingException:ModelMapper 映射错误:

以上是get的异常。

那么如何单独跳过这个日期字段

目前我的代码看起来像,

ModelMapper mapper = new ModelMapper();
mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
MyClass obj=mapper.map(anotherObject,MyClass.class);
Run Code Online (Sandbox Code Playgroud)

我的课

public class MyClass {

    int id;

    Date updated_at;

}
Run Code Online (Sandbox Code Playgroud)

另一个Object.toString

{id=6,updated_at=2018-02-23T03:01:12}
Run Code Online (Sandbox Code Playgroud)

更新 2

为这里的误导道歉。实际上,我的anotherObject不是类对象。我将在下面解释我的确切情况

我的 API 响应

{
    "rows": 1,
    "last": null,    
    "results": [
        {
            "id": "1",
            "updated_at;": "2018-01-22T13:00:00",
        },
        {
            "id": "2",
            "updated_at;": "2018-01-22T13:00:00",
        }

                ]
}
Run Code Online (Sandbox Code Playgroud)

我的超级班

public class MysuperClass {

    int rows;

    String last;

    List<Object> results;

}
Run Code Online (Sandbox Code Playgroud)

使用 …

java api spring modelmapper

5
推荐指数
1
解决办法
5195
查看次数

尝试将实体映射到 DTO 对象时,ModelMapper 返回 NULL

这是我要映射的对象的类:

package com.agent.module.entities;


import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

@Entity
@Getter @Setter @NoArgsConstructor
@Accessors
public class Accommodation {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String location;
    @ManyToOne(optional=false, fetch=FetchType.EAGER)
    private AccommodationType type;

    private String description;

    private String name;
    @OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    private Set<Document> images;

    private Integer capacity;
    @ManyToMany(fetch=FetchType.EAGER)
    private Set<AdditionalService> additionalServices;

    @OneToMany(orphanRemoval=true, fetch=FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    private …
Run Code Online (Sandbox Code Playgroud)

java dto modelmapper spring-boot

5
推荐指数
1
解决办法
5600
查看次数

尝试定义自定义 PropertyMap 时出现 NullPointerException

我按以下方式使用 ModelMapper :

我有一些转换器类,它们是 Spring 组件,它们注册自定义 ModelMapper 映射

@Component
public class FooConverter {

    @Autowired
    private ModelMapper modelMapper;

    public static final PropertyMap<Foo, FooModel> FOO_TO_FOO_MODEL_MAP = new PropertyMap<Foo, FooModel>() {
        @Override
        protected void configure() {
            map().setTimeZone(source.getTimeZone().getID());
        }
    };

    @PostConstruct
    public void init() {
        modelMapper.addMappings(FOO_TO_FOO_MODEL_MAP);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当 Spring 启动时,我收到以下错误,因为配置函数被调用并且源为空。

那应该如何运作?

难道是我用错了?

1 error
    at org.modelmapper.internal.Errors.throwConfigurationExceptionIfErrorsExist(Errors.java:241)
    at org.modelmapper.internal.ExplicitMappingBuilder.build(ExplicitMappingBuilder.java:244)
    at org.modelmapper.internal.ExplicitMappingBuilder.build(ExplicitMappingBuilder.java:96)
    at org.modelmapper.internal.TypeMapImpl.addMappings(TypeMapImpl.java:92)
    at org.modelmapper.internal.TypeMapStore.getOrCreate(TypeMapStore.java:124)
    at org.modelmapper.ModelMapper.addMappings(ModelMapper.java:113)
    at com.agilitypr.neptune.account.api.v1.controllers.PreferenceController.getUserAccountPreferences(PreferenceController.java:63)
    at com.agilitypr.neptune.account.api.v1.controllers.PreferenceController$$FastClassBySpringCGLIB$$3559fcbb.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
    at com.agilitypr.neptune.account.api.v1.filters.AuthorizationFilter.doAuthorize(AuthorizationFilter.java:52)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) …
Run Code Online (Sandbox Code Playgroud)

java spring nullpointerexception modelmapper

5
推荐指数
2
解决办法
8472
查看次数

Java ModelMapper - 无法将 java.util.List 转换为 java.util.List

我正在使用 Java ModelMapper 库将 DTO 映射到 ORM@Entity对象。我有以下测试设置:

    public class MapperTest {

    @Autowired
    private ModelMapper mapper;

    @Autowired
    private TicketRepository ticketRepo;

    @Test
    public void testTicket() {
        Ticket ticket = ticketRepo.findById(4).get();

        TicketDTO dto = mapper.map(ticket, TicketDTO.class);
        assertThat(dto.getEquipmenDescription()).isEqualTo(ticket.getEquipment().getDescription());
        assertThat(dto.getEquipmentNotes()).isEqualTo(ticket.getEquipmentNotes());
        assertThat(dto.getId()).isEqualTo(ticket.getId());
        assertThat(dto.getNotes()).isEqualTo(ticket.getNotes());
        assertThat(dto.getOracleID()).isEqualTo(ticket.getOracleID());
        assertThat(dto.getPropertyID()).isEqualTo(ticket.getPropertyID());
        assertThat(dto.getNotes().size()).isEqualTo(ticket.getNotes().size());

        for (TicketNoteDTO note : dto.getNotes()) {
            assertThat(note.getId()).isNotEqualTo(0);
            assertThat(note.getIssueDate()).isNotNull();
            assertThat(note.getUserUserName()).isNotEmpty();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

这失败并出现以下错误:

org.modelmapper.MappingException: ModelMapper mapping errors:

1) Converter org.modelmapper.internal.converter.CollectionConverter@501c6dba failed to convert java.util.List to java.util.List.
Run Code Online (Sandbox Code Playgroud)

以下是我的实体和相应的 DTO。为简洁起见,省略了 getter 和 setter。

   @Entity
    @Table(name = "ticket")
    public class …
Run Code Online (Sandbox Code Playgroud)

java modelmapper

5
推荐指数
0
解决办法
1381
查看次数

模型映射器中的延迟初始化异常

ModelmapperLazyInitializationException在从实体转换为 dto 时给出。

有什么办法可以禁用它。如果我modelmapper.map在事务块内部调用它工作正常,但它正在加载我根本不想要的所有惰性对象。我想要如果懒惰然后根本不加载它。

转换器 org.modelmapper.internal.converter.MergingCollectionConverter@6a51c12e 未能将 org.hibernate.collection.internal.PersistentSet 转换为 java.util.Set。

引起:org.modelmapper.MappingException:ModelMapper 映射错误:

1) 无法从中获取价值 com.app.flashdiary.entity.Vendor.getApproved()

引起:org.hibernate.LazyInitializationException:无法初始化代理 [com.app.flashdiary.entity.Vendor#1] - 在 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:169) 没有会话

java hibernate modelmapper

5
推荐指数
1
解决办法
3071
查看次数

Java ModelMapper:将DTO映射到EmbeddedId实体类

我想知道是否可以将 DTO 映射到具有复合 pk 的实体类。我一直在阅读有关 PropertyMap 的 ModelMapper 文档,但我无法使其工作。

这是代码:

计划DTO

public class PlanDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    private String formula;
    private String frequency;
    private String pricingtable;
    // getters and setters omitted
Run Code Online (Sandbox Code Playgroud)

计划编号

@Embeddable
public class PlanId implements Serializable {
    private static final long serialVersionUID = 1L;
    private Long id;
    private String name;
    public BillingPlanId() { }
    public PlanId(Long id, String name) {
        this.id = id; …
Run Code Online (Sandbox Code Playgroud)

java modelmapper

5
推荐指数
1
解决办法
2099
查看次数

ModelMapper:如何映射作为通用传递的 List&lt;String&gt; ?

我有一个抽象类:

public abstract class AbstractBeanDTO<T> extends AbstractBigDTO {
protected T value;

//getter setter 
}
Run Code Online (Sandbox Code Playgroud)

扩展类具有泛型类型 List

public class ItemsBeanDTO extends AbstractBeanDTO<List<String>> {
}
Run Code Online (Sandbox Code Playgroud)

我试图将模型类映射到 DTO,它也具有相同的结构。

AbstractBeanDTO<?> dto =  (AbstractBeanDTO<?>) modelMapper.map(modelBean, ItemsBeanDTO.class);
Run Code Online (Sandbox Code Playgroud)

我的 modelMapper 配置为严格匹配。它能够转换其他泛型类型,如 Long、Integer、String,但不能转换 List。

我收到以下错误:

org.modelmapper.MappingException: ModelMapper mapping errors:

1) Failed to instantiate instance of destination java.util.List. Ensure that java.util.List has a non-private no-argument constructor.
Caused by: java.lang.NoSuchMethodException: java.util.List.<init>()
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getDeclaredConstructor(Unknown Source)
    at org.modelmapper.internal.MappingEngineImpl.instantiate(MappingEngineImpl.java:333)
    at org.modelmapper.internal.MappingEngineImpl.createDestination(MappingEngineImpl.java:348)
    at org.modelmapper.internal.MappingEngineImpl.typeMap(MappingEngineImpl.java:141)
    at org.modelmapper.internal.MappingEngineImpl.map(MappingEngineImpl.java:115)
    at org.modelmapper.internal.converter.MergingCollectionConverter.convert(MergingCollectionConverter.java:59)
    at org.modelmapper.internal.converter.MergingCollectionConverter.convert(MergingCollectionConverter.java:31)
    at …
Run Code Online (Sandbox Code Playgroud)

java modelmapper

5
推荐指数
1
解决办法
5411
查看次数