代码之家  ›  专栏  ›  技术社区  ›  Niresh

使用ModelMapper将UserDTO中的Long字段映射到User的createdBy字段中的Long字段

  •  0
  • Niresh  · 技术社区  · 2 年前

    UserDTO中的roleId正在正确映射到User类中的角色对象ID,但createdBy的情况并非如此,它显示为null

    我使用了ModelMapper库来减少代码。我这里有什么遗漏的吗,提前谢谢

    UserDTO.class

    package com.merck.nlp.dto;
    
    import com.merck.nlp.validation.CreateGroup;
    import com.merck.nlp.validation.UpdateGroup;
    
    import jakarta.validation.constraints.Email;
    import jakarta.validation.constraints.NotBlank;
    import jakarta.validation.constraints.NotNull;
    import jakarta.validation.constraints.Pattern;
    import jakarta.validation.constraints.Positive;
    import jakarta.validation.constraints.Size;
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @Builder
    public class UserDTO {
        
    //  @NotNull(groups = {UpdateGroup.class}, message = "ID cannot be null")
    //  @Positive(groups = {UpdateGroup.class})
    //  private Long id;
        
        @NotBlank(groups = {CreateGroup.class}, message = "XUID cannot be empty")
        @Pattern(groups = {CreateGroup.class, UpdateGroup.class}, regexp = "^[a-zA-Z0-9]+$", message = "XUID can only contain alphanumeric characters")
        private String xuid;
        
        @NotBlank(groups = {CreateGroup.class, UpdateGroup.class}, message = "First name cannot be empty")
        @Pattern(groups = {CreateGroup.class, UpdateGroup.class}, regexp = "^[a-zA-Z0-9]+$", message = "First name can only contain alphanumeric characters")
        @Size(groups = {CreateGroup.class, UpdateGroup.class}, min = 3, max = 30, message = "First name must be between 3 and 30 characters")
        private String firstName;
        
        @NotBlank(groups = {CreateGroup.class, UpdateGroup.class}, message = "Last name cannot be empty")
        @Pattern(groups = {CreateGroup.class, UpdateGroup.class}, regexp = "^[a-zA-Z0-9]+$", message = "Last name can only contain alphanumeric characters")
        @Size(groups = {CreateGroup.class, UpdateGroup.class}, min = 3, max = 30, message = "Last name must be between 3 and 30 characters")
        private String lastName;
        
        @Email(groups = {CreateGroup.class, UpdateGroup.class}, message = "Email should be valid")
        @NotNull(groups = {CreateGroup.class}, message = "Email cannot be null")
        private String email;
        
        private Boolean isActive;
        
        @Positive(groups = {CreateGroup.class, UpdateGroup.class}, message = "Role ID must be a positive number")
        @NotNull(groups = {CreateGroup.class, }, message = "Role ID cannot be null")
        private Long roleId;
        
        @NotNull(groups = {CreateGroup.class})
        @Positive(groups = {CreateGroup.class}, message = "Created By ID must be a positive number")
        private Long createdById;
    //  
    //  @NotNull(groups = {UpdateGroup.class})
    //  @Positive(groups = {UpdateGroup.class}, message = "Updated By ID must be a positive number")
    //  private Long updatedById;
    
    }
    

    UserService.class

    package com.merck.nlp.service;
    
    import org.modelmapper.ModelMapper;
    import org.modelmapper.convention.MatchingStrategies;
    import org.modelmapper.spi.MatchingStrategy;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.merck.nlp.dto.UserDTO;
    import com.merck.nlp.model.Role;
    import com.merck.nlp.model.User;
    import com.merck.nlp.repository.RoleRepository;
    import com.merck.nlp.repository.UserRepository;
    import com.merck.nlp.exception.RoleNotFoundException;
    
    @Service
    public class UserService {
    
        @Autowired
        private UserRepository userRepository;
    
        @Autowired
        private RoleRepository roleRepository;
    
        @Autowired
        private ModelMapper modelMapper;
    
        public User createUser(UserDTO userDTO) {
            
    //      modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.LOOSE);
            
    //       modelMapper.typeMap(UserDTO.class, User.class).addMappings(mapper -> {
    //           mapper.skip(User::setRole);
    //             mapper.map(UserDTO::getCreatedById, (destination, value) -> destination.getCreatedBy().setId((Long)value));
    //         });
    
            // Map DTO to User entity
    //      modelMapper.
            
            User user = modelMapper.map(userDTO, User.class);
            System.out.println(user.getCreatedBy());
            modelMapper.validate();
            // Resolve Role
            Role role = null;
            if (user.getRole().getId() != null) {
                role = roleRepository.findById(user.getRole().getId())
                        .orElseThrow(() -> new RoleNotFoundException("Role not found with ID: " + user.getRole().getId()));
            } else if (user.getRole().getName() != null) {
                role = roleRepository.findByName(user.getRole().getName());
            }
            if (role == null) {
                // Handle role not found error or set a default role
            }
            user.setRole(role);
    
            // Save user to repository or perform other operations
            return userRepository.save(user);
        }
    }
    

    有效载荷

        {
        "firstName": "niresh",
        "lastName": "kef",
        "email": "[email protected]",
        "xuid":"weffeferfreergerferrrergerer",
        "createdById": 1,
        "roleId": 1    
       }
    

    User.class

    package com.merck.nlp.model;
    
    import java.sql.Timestamp;
    
    import org.hibernate.annotations.ColumnDefault;
    import org.hibernate.annotations.CreationTimestamp;
    
    import com.merck.nlp.dto.UserDTO;
    
    import jakarta.persistence.CascadeType;
    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.persistence.GenerationType;
    import jakarta.persistence.Id;
    import jakarta.persistence.JoinColumn;
    import jakarta.persistence.ManyToOne;
    import jakarta.persistence.Table;
    import jakarta.validation.constraints.NotNull;
    import lombok.AllArgsConstructor;
    import lombok.Builder;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Entity
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @Table(name = "users")
    public class User {
        
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        
        private String xuid;
        
        private String firstName;
        
        private String lastName;
        
        private String email;
        
        @ColumnDefault("false")
        private Boolean isActive;
            
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "role_id")
        private Role role;
        
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "created_by")
        private User createdBy;
        
        @CreationTimestamp
        private Timestamp createdAt;
        
        @ManyToOne(cascade = CascadeType.MERGE)
        @JoinColumn(name = "updated_by")
        private User updatedBy;
        
        private Timestamp updatedAt;
    
        public User(Long id) {
            this.id = id;
        }
    
    }
    
    0 回复  |  直到 2 年前