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

Spring MVC@requestbody json单参数问题

闻人鸿文
2023-03-14

我在RESTAPI应用程序中遇到了无法理解的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();
    }

字段为“name”的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时,也不例外。有什么想法吗?Thanx公司。

这是我的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;
}

共有2个答案

乜坚成
2023-03-14

这就是解决方案

public class CategoryDTO {
@NotNull(message = MessageContent.VALID_NOT_NULL)
@NotBlank(message = MessageContent.VALID_NOT_BLANK)
@Size(max = 50, message = MessageContent.VALID_MAX_SIZE + 50)
String name;
//String test;

@JsonCreator
public CategoryDTO(String name) {
    this.name = name;
}

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

}

我删除了@Value注释,并用@JsonCreator注释显式声明了setters/getter和构造函数。Thanx寻求帮助。

段干博涉
2023-03-14

您需要一个包含所有参数的构造函数:

public CategoryDTO(String name) {
    this.name = name;
}

或者使用@AllArgsConstructor或来自lombok的@Data。

 类似资料:
  • 我使用以下列表从控制器填充了JSP中的下拉列表:“” 例如,我使用下拉菜单将5保存为db中thirdPartyOccupationId的值。当我重新加载页面时,值5不是选中的值。 同一段代码正在处理不同的字段,我不知道我错过了什么。 模型类: ReportClass.java 控制器.java 感谢任何指点。

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 本文向大家介绍SpringMVC Controller解析ajax参数过程详解,包括了SpringMVC Controller解析ajax参数过程详解的使用技巧和注意事项,需要的朋友参考一下 在使用ajax发送请求时,如果发送的JSON数据的参数是一个类中的不同属性,在Controller类的方法中使用@RequestBody Object obj会直接封装进obj对象中 例如: 前端部分代码 J

  • 本文向大家介绍SpringMVC的@InitBinder参数转换代码实例,包括了SpringMVC的@InitBinder参数转换代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringMVC的@InitBinder参数转换代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 以上就是本文的全部内容,希望对大家的学习有所

  • 本文向大家介绍springmvc之获取参数的方法(必看),包括了springmvc之获取参数的方法(必看)的使用技巧和注意事项,需要的朋友参考一下 1、导包,四大核心包,一个切面包(AOP),logging,web,springmvc 2、配置文件,核心代码如下: web.xml springmvc.xml index.jsp: 首页进入 3./WEB-INF/pages 跳转后的内容 1).su