当前位置: 首页 > 知识库问答 >
问题:

问题映射字段ModelMapper

司空思聪
2023-03-14

我使用DTO和modelMapper是为了不让某些字段可见。我有一个类别实体,可以有子类别

public class CategoryEntity {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    @Column(length = 30, nullable = false)
    private String categoryKeyId;

    @Column(nullable = false)
    private String name;

    @ManyToOne(optional = true, fetch = FetchType.LAZY)
    @JoinColumn(name="parent_id", nullable=true)
    private CategoryEntity parentCategory;

    // allow to delete also subcategories
    @OneToMany(mappedBy="parentCategory", cascade = CascadeType.ALL)
    private List<CategoryEntity> subCategories;
}

创建类别时,我使用模型:

@Getter @Setter
public class CategoryRequestModel {
    private String name;
    private String parentCategoryKeyId;
}

在此模型中,我希望parentCategoryKeyId与父对象的categoryKeyId匹配。

例如,如果我创建了一个“顶级”类别:

{
  "name": "topCategory"
} 

它返回给我:

{
    "categoryKeyId": "jUcpO27Ch2YrT2zkLr488Q435F8AKS",
    "name": "topCategory",
    "subCategories": null
}

当我这样做时:

{
  "name": "sub",
  "parentCategoryKeyId": "jUcpO27Ch2YrT2zkLr488Q435F8AKS"
} 

在我的控制器中,我将其余对象传递给DTO层,该层调用服务:

public CategoryRestResponseModel createCategory(@RequestBody CategoryRequestModel categoryRequestModel) {
    CategoryRestResponseModel returnValue = new CategoryRestResponseModel();
    if( categoryRequestModel.getName().isEmpty())
        throw new NullPointerException(ErrorMessages.MISSING_REQUIRED_FIELDS.getErrorMessage());
    ModelMapper modelMapper = new ModelMapper();
    CategoryDto categoryDto = modelMapper.map(categoryRequestModel, CategoryDto.class);
    CategoryDto createdCategory = categoryService.createCategory(categoryDto);
    returnValue = modelMapper.map(createdCategory, CategoryRestResponseModel.class);
    return returnValue;
}

我的类别是基本的POJO:

@Getter @Setter
public class CategoryDto implements Serializable {
    @Getter(AccessLevel.NONE)
    private static final long serialVersionUID = 1L;

    private String categoryKeyId;
    private String parentCategoryKeyId;
    private String name;
    private CategoryDto parentCategory;
    private List<CategoryDto> subCategories;
}

为我服务:

   public CategoryDto createCategory(CategoryDto categoryDto) {
        //1. Create an empty object to return
        System.out.println("Hello World");
        CategoryDto returnValue = new CategoryDto();
        System.out.println("CategoryDto: " + categoryDto);
        // check if category exists
        if (categoryRepository.findByName(categoryDto.getName()) != null)
            throw new ApplicationServiceException("Record already in Database");

        ModelMapper modelMapper = new ModelMapper();
        CategoryEntity categoryEntity = modelMapper.map(categoryDto, CategoryEntity.class);

        // Generate categoryKeyId
        String categoryKeyId = utils.generateCategoryKeyId(30);
        categoryEntity.setCategoryKeyId(categoryKeyId);
        System.out.println("categoryDto parentCategory: " + categoryDto.getParentCategory());
        System.out.println("CategoryDto: " + categoryDto);

        if(categoryDto.getParentCategoryKeyId() != null) {
            CategoryEntity parentCategory = categoryRepository.findByCategoryKeyId(categoryDto.getParentCategoryKeyId());
            categoryEntity.setParentCategory(parentCategory);
            System.out.println("CategoryEntity: " + categoryEntity);
            System.out.println("parentCategory: " + parentCategory);
        }

        CategoryEntity storedCategory = categoryRepository.save(categoryEntity);
        returnValue = modelMapper.map(storedCategory, CategoryDto.class);

        return returnValue;
    }

我的问题是,我想保存的子类别和检索ID匹配的类别KeyId...

数据库中,我的条目应该是这样的

我的第一个条目应该有:id=1-parent_id=null,category_key_id=jUcpO27Ch2YrT2zkLr488Q435F8AKS,name=topClass...AND: id=2-parent_id=1,category_key_id="另一个生成的密钥", name=sub

不幸的是,我只是保留了id、categorykeyid和名称。我从CategoryTo中删除了id,并获得:1)转换器组织。模型映射器。内部的转换器。NumberConverter@348fc3d8无法转换java。字符串转换为java。朗,朗。

共有1个答案

关冠宇
2023-03-14

我用一种“肮脏”的方式解决了它。我只是更改了条目中的对象并添加了一个长id。

它给了我:

@Getter @Setter
public class CategoryRequestModel {
    private Long id;
    private String name;
    private String parentCategoryKeyId;
}
 类似资料:
  • 我想映射到产品字段,而不创建类 应该如何序列化和反序列化?

  • Navicat 会依源表或集合对字段类型和長度作出假设。你可以从下拉式菜单选择你所需的类型。 【提示】导入多个表或集合时,你可以从下拉式菜单选择其他表或集合。 如果你导入数据到现有的表或集合,你则需要手动映射源字段名到目标,或按住 Control 键并点按字段,然后选择“智慧匹配全部字段”、“按次序匹配全部字段”和“全部取消匹配”来进行快速匹配。 如果你透过 ODBC 导入,“条件式查询”按钮会打

  • 我与ModelMapper框架有麻烦。请解释为什么我看到以下行为。 我在build.gradle有以下依赖性 和一个类客户: 我还有一个地图绘制工具: 还有一个测试 在fred()中,方法输出是非红色的“Customer{name=fred,age=40}”(“Customer{name=null,age=40}”)。你能解释一下为什么吗?为什么我在第一个方法中看不到输出“George”?

  • 需要把 A 系统某一堆接口的字段, 映射到 B 系统的某一堆接口的字段, 其实涵义是一样的, 情况大致有这样一些 字段取名不一样 类型不一样 字符串日期对应Date日期 在A系统是一个字段, 对应B系统为两个字段 在A系统有,B系统没有 在A系统是平行结构, 在B 系统有类中类结构 感觉只能手动一个个去 set get , 有啥好的转换工具可以一次性转好的没, 像写一个配置文件一次性转好

  • 我犯了一个错误,比如: 我知道在堆栈溢出中已经出现了一些类似的问题,但解决方案对我来说并不适用。请您检查一下我的实体,以便找出到底是什么导致了这个问题? 使用者 组 角色 控制器方法 痕迹 /vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(2607):教义\ORM\实用程序\标识符Flattener- 解决了的! 该问题是由重新定义的方法引起

  • 我在Spring绘制地图时遇到了麻烦。我有一个Spring web项目,有用户和数据库。我得到了这个网站。xml: 今年Spring: 这是我的控制器: 我想把所有的请求映射到网址“http://localhost:8080/CRUDWebAppMavenized/users”将打开users.jsp.但我总是只看到错误页面。 IDE告诉我: 警告:org.springframework.web.