用简单的 POJO 或 DTO 对象替换这个持久化实体?

Posted

技术标签:

【中文标题】用简单的 POJO 或 DTO 对象替换这个持久化实体?【英文标题】:Replace this persistent entity with a simple POJO or DTO object? 【发布时间】:2021-12-24 11:07:36 【问题描述】:

我一直在使用声纳来测试我的代码质量,但我无法用我的代码解决漏洞问题,它说我应该使用 Dto 或 pojo 类而不是实体类,但仍然无法解决它我不知道如何转换我的实体上课。 这是我的实体类:

@Entity
public class Mission implements Serializable 

private static final long serialVersionUID = -5369734855993305723L;


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

private String name;

private String description;

@ManyToOne
private Departement departement;

@OneToMany(mappedBy="mission")
private  List<Timesheet> timesheets;

public Mission() 
    super();


public Mission(String name, String description)
    this.name = name;
    this.description = description;



public int getId() 
    return id;


public void setId(int id) 
    this.id = id;


public String getName() 
    return name;


public void setName(String name) 
    this.name = name;


public String getDescription() 
    return description;


public void setDescription(String description) 
    this.description = description;


public Departement getDepartement() 
    return departement;


public void setDepartement(Departement departement) 
    this.departement = departement;


public List<Timesheet> getTimesheets() 
    return timesheets;


public void setTimesheets(List<Timesheet> timesheets) 
    this.timesheets = timesheets;

这是我遇到问题的 Restcontroller 方法:

    @PostMapping("/ajouterMission")
@ResponseBody
public int ajouterMission(@RequestBody Mission mission) 
    itimesheetservice.ajouterMission(mission);
    try 
        logger.info("in ajouter Mission");
        logger.debug("Je vais commencer l'ajout");
        itimesheetservice.ajouterMission(mission);
        logger.info("out ajouter Mission");
        return mission.getId();
        
    catch (Exception e)  logger.error("Erreur dans ajouterMission() : " , e); 
    return mission.getId();

这是有关声纳漏洞问题的屏幕截图以获取更多详细信息:enter image description here

【问题讨论】:

您在创建 DTO 时遇到了什么具体问题? 我已经创建了 DTO 但声纳仍然将其视为一个实体,如果您有任何建议如何将我的实体转换为 DTO 类以及如何在控制器上使用它 this is the rule description,请参阅“合规解决方案”部分...,在“更大的项目”上完成此操作:google.com/search?q=java+mapping+framework+comparison 您的 @Post/Get/.../RequestMapping 仍然有参数,这些参数(类)被注释为 @Entity,这是规则实际上在抱怨的。 ..a DTO 是一个类,它看起来[有点 - 非常] 像实体 ..并且具有相似的名称,但控制器和服务必须转换它们(来回) 【参考方案1】:

不要将您的实体模型放入控制器方法中。您必须为@RequestBody 创建另一个模型,例如MissionRequestModel,然后将您的请求模型转换为您的实体

public class MissionRequestModel 
private String name;
private String description;

@PostMapping("/ajouterMission")
@ResponseBody
public int ajouterMission(@RequestBody MissionRequestModel missionRequestModel) 
     Mission mission = new Mission(missionRequestModel);

【讨论】:

谢谢,我只需要在任务实体上设置一个新的构造函数,将 MissionDTO 转换为任务并在控制器上调用它

以上是关于用简单的 POJO 或 DTO 对象替换这个持久化实体?的主要内容,如果未能解决你的问题,请参考以下文章

pojo与DTO的区别是啥?

java术语(PO/POJO/VO/BO/DAO/DTO)

POJO简介pojo模块

pojo类和vo类分别是啥

Java的常见术语(PO/POJO/VO/BO/DAO/DTO)

PO VO BO DTO POJO DAO的解释