java - Spring MVC @requestbody json 一参数问题
问题描述
我的 REST API 应用程序中的 Spring MVC 存在难以理解的问题。我创建了只有一个字段的 POJO java 类和带有 @RequestBody 注释的控制器:
@PostMapping ("/add")
ResponseEntity<ResponseDetails> save(@Valid @RequestBody CategoryDTO categoryDTO) {
Category category = categoryService.save(categoryDTO);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(category.getId())
.toUri();
return ResponseEntity.created(location).build();
}
具有字段“名称”的 POJO 类:
@Value
@Builder
public class CategoryDTO {
@NotNull(message = MessageContent.VALID_NOT_NULL)
@NotBlank(message = MessageContent.VALID_NOT_BLANK)
@Size(max = 50, message = MessageContent.VALID_MAX_SIZE + 50)
@JsonProperty("name")
String name;
}
当我发送 json 请求时出现问题:
{
"name": "22"
}
此请求的结果是异常:
2021-01-21 14:42:38.917 WARN 11084 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `pl.pg.funfactsrap.category.dto.CategoryDTO` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `pl.pg.funfactsrap.category.dto.CategoryDTO` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (PushbackInputStream); line: 2, column: 5]]
当我发送带有两个或更多参数的 json 时也不例外。任何想法?谢谢。
这是我的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>pl.pg</groupId>
<artifactId>funfactsrap</artifactId>
<version>1.0.0</version>
<name>Fun Facts RAP</name>
<description></description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
这很好(下):
@Value
@Builder
public class CategoryDTO {
@NotNull(message = MessageContent.VALID_NOT_NULL)
@NotBlank(message = MessageContent.VALID_NOT_BLANK)
@Size(max = 50, message = MessageContent.VALID_MAX_SIZE + 50)
@JsonProperty("name")
String name;
String test;
}
解决方案
您需要一个带有所有参数的构造函数:
public CategoryDTO(String name) {
this.name = name;
}
或者使用来自 lombok 的 @AllArgsConstructor 或 @Data。
推荐阅读
- javascript - 为什么 JavaScript 在 Rails 6 中不能按预期工作?
- graph - 源和多个目的地之间的最短路径
- windows - 自定义 .bat 文件,打开多个选项卡并在每个选项卡中执行一个命令
- java - Bday finder 使用输入 java
- sql - 使用 set 更新具有多个值的 SQL Server 表
- python - 如何使用 pytest-mock 有条件地模拟函数
- python - 安装 TensorFlow Profiler for Dummies
- google-chrome - 在 chrome 浏览器中启用“阻止第三方 cookie”时,类 ui.showModalDialog 引发 LocalStorage Security 异常
- sharepoint - 从 Teams 选项卡调用 SharePoint REST API
- python - 导入类 - Python