将 JSON 发布到控制器返回 400 Bad Request

2024-03-13

我正在开发 RESTful 服务。 我无法将 JSON 数据发布到控制器。

我正在使用以下依赖项:

  • 春季:3.2.3.发布
  • 杰克逊:1.9.6

我也尝试过:

  • Spring 3.2.3.RELEASE 与 Jackson 1.9.9
  • Spring 3.1.1.RELEASE w/ Jackson 1.9.9

正如这里所建议的将 JSON 发布到 Spring MVC 控制器返回 400 错误请求 https://stackoverflow.com/questions/22869403/posting-json-to-spring-mvc-controller-returns-400-bad-request

我也输入了 MessageConverters,

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    </mvc:message-converters>
</mvc:annotation-driven>

控制器

@Controller
@RequestMapping(value="/todo", consumes="application/json", produces="application/json")
//@RequestMapping(value="/todo", consumes="text/plain", produces="application/json")
public class TodoRestService {
   Logger logger = LoggerFactory.getLogger(TodoService.class);
   @Autowired
   private TodoService todoService;

   @RequestMapping(value="/{id}", method= RequestMethod.GET)
   @ResponseBody public Todo find(@PathVariable("id") Long id) {
     Todo todo = todoService.find(id);
     return todo;
   }

   @RequestMapping(method=RequestMethod.POST)
   @ResponseBody public Todo create(@RequestBody Todo todo) {
   //public Todo create(@RequestBody String todo) {
   //public Todo create(@RequestParam("todo") String todo) {
     System.out.println(todo);
     todoService.create(newTodo);
     return newTodo;
  }
}

POJO

public class TODO {
  private String firstName;
  private String lastName;

  //getter setters
} 

我正在使用邮递员来发布 JSON

我已将 Content-Type 设置为 application/json

表单数据----- 名称 = 待办事项 值 = {"firstName":"nilam","lastName":"naik"}

方法=POST

我收到 400 错误请求。

但是如果我将 @RequestBody 注释的参数的数据类型从 TODO 更改为 String 那么
我得到类似的东西,

------WebKitFormBoundaryu6banLlTPiPudsBB
Content-Disposition: form-data; name="todo"

{"firstName":"nilam","lastName":"naik"}
------WebKitFormBoundaryu6banLlTPiPudsBB--

我的类路径上也有 Jackson。

如果我将属性 Consumers 从 application/json 更改为 text/plain 并且

@RequestBody String todo 然后我得到,

{"firstName":"nilam","lastName":"naik"}

但我不想手动将字符串转换为 Java 对象。但我不明白为什么 @RequestBody 无法将我的 JSON 数据转换为 Java 对象。

pom.xml

<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 http://maven.apache.org/maven-      v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.orci</groupId>
    <artifactId>OrciMavenTutorial</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>OrciMavenTutorial Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <properties>
        <!-- <org.springframework.version>3.2.3.RELEASE</org.springframework.version> -->
        <org.springframework.version>3.1.1.RELEASE</org.springframework.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId> 
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId> 
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework.version}</version>
        </dependency>

        <dependency>
             <groupId>org.hibernate</groupId>
             <artifactId>hibernate-entitymanager</artifactId>
             <version>4.2.2.Final</version>
        </dependency>

        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>3.0.1</version>
             <scope>provided</scope>
        </dependency>

        <dependency>
             <groupId>org.apache.derby</groupId>
             <artifactId>derbyclient</artifactId>
             <version>10.5.3.0_1</version>
        </dependency>

        <dependency>
              <groupId>org.apache.derby</groupId>
              <artifactId>derby</artifactId>
              <version>10.5.3.0_1</version>
        </dependency>

        <dependency>
              <groupId>org.slf4j</groupId>
              <artifactId>slf4j-api</artifactId>
              <version>1.7.7</version>
        </dependency>

        <dependency>
              <groupId>org.codehaus.jackson</groupId>
              <artifactId>jackson-core-asl</artifactId>
              <!-- <version>1.9.6</version> -->
              <!-- <version>1.4.2</version> -->
              <!-- <version>1.9.9</version> -->
              <version>1.9.7</version>
        </dependency>

       <dependency>
             <groupId>org.codehaus.jackson</groupId>
             <artifactId>jackson-mapper-asl</artifactId>
             <!-- <version>1.9.6</version> -->
             <!-- <version>1.4.2</version> -->
             <!-- <version>1.9.9</version> -->
             <version>1.9.7</version>
       </dependency>
 </dependencies>
 <build>
     <finalName>OrciMavenTutorial</finalName> 
 </build>

请有人帮助我。


从您给出的解释可以清楚地看出,您错误地使用了 POSTMAN。

您不能发送@RequestBodya 中带注释的对象form-data。表单处理使用@ModelAttribute or @RequestParam(这个的倍数)。

如果您想将 JSON 发布到控制器端点,您必须如下图所示进行操作;

您必须选择POST显然并且必须设置一个标题Content-Type as application/json,最后你必须选择raw从选项卡中选择JSON从下拉菜单中。

如果您遵循此操作,您的控制器方法必须与Todo对象为@RequestBody注解,无需使用String并手动转换为对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JSON 发布到控制器返回 400 Bad Request 的相关文章

  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • Spring Data JPA,对多对多实体的一个属性的更改错误地显示在共享它的所有其他实体上

    当我更改实体的一个属性时 使用该实体的每个其他实体也会以某种方式更改它 我有三个实体 如下所示 学生和课程之间需要有多对多的关系 课程需要和课程讲座有一对多的关系 当我通过 Transactional 更改属于特定学生的课程或课程讲座时st
  • 如何在 Spring 中使 @PropertyResource 优先于任何其他 application.properties ?

    我正在尝试在类路径之外添加外部配置属性资源 它应该覆盖任何现有的属性 但以下方法不起作用 SpringBootApplication PropertySource d app properties public class MyClass
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • Akka 与现有 java 项目集成的示例

    如果我已经有现有的javaWeb 应用程序使用spring and servlet容器 将 Akka 集成到其中的正确方法是什么 就像我将会有Actor1 and Actor2互相沟通的 开始使用这些演员的切入点是什么 例如 1 把它放在那
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 如何在JPanel中设置背景图片

    你好 我使用 JPanel 作为我的框架的容器 然后我真的想在我的面板中使用背景图片 我真的需要帮助 这是我到目前为止的代码 这是更新 请检查这里是我的代码 import java awt import javax swing import
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • Ruby on Rails REST 设计问题 - 在账户之间转账

    我有一个 Account 类 想要实现转账屏幕以允许用户在 2 个账户之间转账 我将如何实现这种 RESTful 方式 我有标准帐户和休息操作 那很好 但我该如何实现转移呢 通常我只会向帐户控制器和相应的视图添加一个名为 transfer
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐