我将业务对象映射到实体,并且在某些情况下实体的结构与业务对象不同。
我将userCategories它们作为字符串存储在业务对象中RecipeBo,因为 BO 不需要了解有关实体的内部结构的任何信息。这些字符串需要映射到Recipe和的关系RecipeUserCategoryRel,除此之外,另一个字段userId也RecipeBo需要映射到其中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) 我正在尝试使用 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) 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-问题
我错过了什么?
我正在尝试使用 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)
为这里的误导道歉。实际上,我的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)
使用 …
这是我要映射的对象的类:
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) 我按以下方式使用 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 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) 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) 没有会话
我想知道是否可以将 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) 我有一个抽象类:
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 ×10
modelmapper ×10
spring ×2
api ×1
dto ×1
hibernate ×1
mapping ×1
null ×1
spring-boot ×1