首页 > 解决方案 > 大家好,我面临一些映射异常。我知道这是因为课堂上的不同领域,请提出一些克服它的方法

问题描述

这是我用来存储来自 UI 的值的 UserDTO 类。

public class UserDTO {
 private String emailId;
 private String password;
 private String role;
 // getters and setters
}

这是处理数据库的实体类(我正在使用休眠)。

public class UserEntity {
  @Id
  @Column(name = "EmailId")
  private String emailId;

  @Column(name = "Password")
  private String password;

  @ManyToOne
  @JoinColumn(name = "role_id", nullable = false)
  RoleEntity role;
  // getters and setters
}

以下是具有字符串角色字段的 RoleEntity 类。

public class RoleEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "role_id")
  private int id;

  @Column(name = "role")
  private String role;
  // getters and setters
}

我从请求正文中的 UI 获取用户值。

@RequestMapping(value = "/createUser", method = RequestMethod.POST, produces= {"application/json"})
public ResponseEntity<String> createUser(@RequestBody UserDTO userDTO) {
    return new ResponseEntity<String>(adminService.createUser(userDTO), HttpStatus.CREATED);
}

在这里,我想将角色从 UserDTO 映射到 RoleEntity。我正在使用推土机映射器映射方法将 DTO 映射到实体。 dozerMapper是 DozerBeanMapper 的一个对象userDTO是 UserDTO 的对象, userEntityUserEntity的对象。

//In createUser(UserDTO userDTO)
  dozerMapper.map(userDTO, userEntity); 

错误:

MapId: null
Type: null
Source parent class: com.iiminds.crm.dto.UserDTO
Source field name: role
Source field type: class java.lang.String
Source field value: Admin
Dest parent class: com.iiminds.crm.entity.UserEntity
Dest field name: role
Dest field type: com.iiminds.crm.entity.RoleEntity

org.dozer.MappingException: Illegal object type for the method 'setRole'. 
 Expected types: 
com.iiminds.crm.entity.RoleEntity
 Actual types: 
java.lang.String

2018-10-29 16:15:39.229 ERROR 11516 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/crm] threw exception [Request processing failed; nested exception is org.dozer.MappingException: Illegal object type for the method 'setRole'. 
 Expected types: 
com.iiminds.crm.entity.RoleEntity
 Actual types: 
java.lang.String] with root cause

标签: javahibernatemappingdozer

解决方案


这是因为在你UserDTO.java的角色StringUserEntity.java,角色类型是RoleEntity. 您不能将 String 映射到RoleEntity. 但是,在映射文件中,您可以从映射中排除角色字段,例如:

    <class-a>UserDTO</class-a>
    <class-b>UserEntity</class-b>
    <field-exclude>
        <a>role</a> 
        <b>role</b> 
    </field-exclude>

PS:填写全限定类名。

然后您可以手动创建RoleEntity并将其设置为角色UserEntity


推荐阅读