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

在控制器方法中接受请求体

高山
2023-03-14

在我的控制器中,我有一个用以下映射映射的方法:@PostMapping(“/”)。

此方法需要一个我试图捕获的请求主体,如下所述:

使用这两种方法对我来说都很好,我只是进退两难,如果直接在实体类中接受请求体是一个好主意和最佳实践的话。

我不想在controller类中公开我的实体类,因为我不确定这是否是一个好主意。

@PostMapping("/")
public String create(@Valid @RequestBody Task task) {


}

java

public final class Task {

@NonNull
private int id;

@NotBlank(message = "Name is a mandatory field")
private String name;

private String decription;

@NotBlank(message = "date is a mandatory field")
private String date;

private boolean status;

@NotBlank(message = "severenes is a mandatory field")
private String severenes;

public Task(int id, String name, String decription, String date, boolean status, String severenes) {
    super();
    this.id = id;
    this.name = name;
    this.decription = decription;
    this.date = date;
    this.status = status;
    this.severenes = severenes;
}

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 getDecription() {
    return decription;
}

public void setDecription(String decription) {
    this.decription = decription;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public boolean isStatus() {
    return status;
}

public void setStatus(boolean status) {
    this.status = status;
}

public String getSeverenes() {
    return severenes;
}

public void setSeverenes(String severenes) {
    this.severenes = severenes;
}   
@Entity
@Table(name = "tasks")
public class Tasks {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name = "id")
private int id;

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

@Column(name = "description")
private String description;

@Column(name = "date")
private LocalDateTime date;

@Column(name = "status")
private boolean status;

@Column(name = "severenes")
private String severenes;


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 LocalDateTime getDate() {
    return date;
}

public void setDate(LocalDateTime date) {
    this.date = date;
}

public boolean isStatus() {
    return status;
}

public void setStatus(boolean status) {
    this.status = status;
}

public String getSeverenes() {
    return severenes;
}

public void setSeverenes(String severenes) {
    this.severenes = severenes;
}

这两种方法都给出了相同的结果,更多的是关注要遵循的最佳实践。

共有1个答案

诸俊才
2023-03-14

更多的是与软件设计原理有关。在本例中,这与关注点的分离有关。让我们假设您直接使用一个Tasks实体来进行DB操作和REST操作,而不是将Task(某种DTO)和Tasks(实体)分开。

  • 您有一个在页面上显示任务的UI。
  • 您正在数据库中存储任务。
  • 要求现在已更改。您不再在数据库中存储任务状态,而是需要从第三方endpoint动态获取它。
  • 您需要从Tasks实体字段中删除status字段,但仍需要将其返回到UI。由于您在两个层中使用了相同的实体,因此您不能轻松而明确地删除它,您应该怎么办,一些将来很难维护的变通方法?
  • 您需要做更多的工作来提供这一点,一个需求更改会影响更多的层。
  • 您有一个在页面上显示任务的UI。
  • 您正在数据库中存储任务。
  • 要求现在已更改。您不再在数据库中存储任务状态,而是需要从第三方endpoint动态获取它。
  • 您需要从任务实体字段中删除状态字段,您可以。
  • 已从第三方检索状态字段。
  • 您通过聚合来自第三方和任务实体的状态创建了任务对象
  • 您只更改了一层而不是两层。UI甚至没有意识到需求被更改,甚至您的逻辑层也不关心它。单一责任原则使您不必害怕变化。

是的,可能会有一些缺点,比如您需要更多的类来表示单个对象,但这就是分离。它使项目具有可维护性,易于重构/更改代码,并最大限度地减少更改的影响。

 类似资料:
  • 我需要实现一个接受对象(json)的postendpoint。但对象中的某些参数是可选的。所以,当我尝试进行api调用时,它并没有映射到相应的方法。 显示页面未找到Err: 404 我发送的请求正文只包含两个字段,其余的都是可选的。 对象的Pojo Spring控制器: 卷曲命令: 有效载荷 } Rest控制器:

  • 我正在使用Java和Spring构建一个RESTAPI,我需要在我的控制器中处理一个POST请求,但我需要从该请求中提取主体,它是一个JSON,也是该请求的“来源”, 我有几个问题:首先是如何获取该请求的来源(我猜是在标题中移动的url?),是否有与@RequestBody类似的注释?。 我的第二个问题是,在这种post方法中,通常应该返回什么对象作为响应。

  • 我有以下代码 现在,当我去http://localhost:8080/recipe/2/update,点击提交,我调用@PostMap方法,更新后重定向我到 但是我在控制台上发现了这个错误 这个在网上 当我将@PostMap更改为@Request estMap或添加额外的@GetMaap时,一切正常 有人能解释一下吗?或者我该怎么做才能让@PostMapping按预期工作。 更新:如下面的评论所述

  • 问题内容: 我有一个Sinatra应用程序,并且在我的大多数控制器中,json都会传入并在params对象中自动获取。但是,除非我用before方法来拉取request.body参数,否则我将获得一个根本不获取参数的后期操作.body参数将它们解析为JSON并将它们合并到params哈希中。 这是控制器以及filter方法: 我看到的输出基本上是,控制器操作中的参数实际上正确地位于其中。但是,如果

  • 问题内容: 我正在开发一个使用大量ajax的grails应用程序。如果请求是ajax调用,那么它应该给出响应(这部分正在工作),但是如果我在浏览器中输入URL,它应该带我到主页/索引页面而不是请求的页面。下面是Ajax调用的示例gsp代码。 如果我们在浏览器URL栏中键入http:// localhost:8080 / Dash / todo / list ,则控制器应重定向到http:// lo

  • 我可以通过创建一个新的控制器和ModelAndView方法来进行POST调用,但现在我又面临一个问题,数据无法从JSP传递到控制器。我的JSP代码是: 有一个名为DebitModel的正常bean类。我尝试在许多地方搜索未传递的数据,并找到了提到的form:input解决方案,但如果使用此方法,则没有绑定FoundException'java.lang.IllegalStateException: