Привет всем, я сталкиваюсь с некоторыми исключениями картографии. Я знаю, что это из-за различных полей в классе, пожалуйста, предложите несколько способов преодолеть это - PullRequest
0 голосов
/ 29 октября 2018

Это мой класс UserDTO, который я использую для хранения значений, поступающих из пользовательского интерфейса.

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

И это класс Entity, который имеет дело с базой данных (я использую hibernate).

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
}

И следующий класс RoleEntitity, имеющий строковое поле роли.

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

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

Я получаю пользовательские значения из пользовательского интерфейса в теле запроса.

@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. Я использую метод карты dozer mapper для отображения DTO в Entity. dozerMapper является объектом DozerBeanMapper . userDTO является объектом UserDTO и userEntity объект UserEntity .

//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

1 Ответ

0 голосов
/ 29 октября 2018

Это потому, что в вашей UserDTO.java у вас есть роль String, а в UserEntity.java тип роли - RoleEntity. Вы не можете сопоставить String с RoleEntity. Однако в файле сопоставления вы можете исключить поле роли из сопоставления, например:

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

P.S: Заполните полное имя класса.

Затем вы можете вручную создать RoleEntity и установить для него роль в UserEntity

...