java - 如何在 spring-servlet.xml 中配置 jackson object-mapper 以进行 @RequestBody 转换?

标签 java spring-mvc jackson-databind

我想显示服务器端 ajax 数据表。为此,我需要从 Controller 获取数据。

我的请求将是这样的(来自表单):

var form = { "order":"12r34e56e", "state":"open"} 

我的 Controller 应该将其解析为一个对象,我可以将其发送到 WebService 并从列表中的订单接收所有打开的包。接收到的列表还必须转换为 JSON 格式才能在表中显示。

我的标题看起来像

http://localhost:8080/myWebapp/ordernr/getTableData?{%22orderNummer%22:%2212r34e56e%22}&_=1563526347735

我已经成功尝试使用RequestParam。但我的表单包含更多 Filterparams,如 date1、date2、Adress 等。所以变数太多了。 我徒劳地尝试注释

consumes=MediaType.APPLICATION_JSON_VALUE

我没有更改我的表单对象类“PreparedStatement”,因为 onSubmit 我的表单在没有 ajax 的情况下工作正常。

在我的pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson.version}</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>${jackson.version}</version>
</dependency>

在我的 Controller

@Controller
public class Ordernr extends OrderService {
...
@RequestMapping(value="/ordernr/getTableData", method=RequestMethod.GET)
public String getTable(@RequestBody PreparedStatement ps) {
    OrderService().getOrders(ps);
    return result;
}
...

我的 ajax 调用

"ajax": {
    type: "GET",
    url: "${pageContext.request.contextPath}/getTableData",
    contentType:"application/json",
    dataType:"json",
    data: function(data) {
                var form = { "order":"12r34e56e", "state":"open"} 
                return JSON.stringify(form);
          }
    }

我的 JSON 有效。我在https://jsonformatter.curiousconcept.com/中测试了它 但我明白了

"Error parsing HTTP request header. Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986"

我想我需要在 spring-servlet.xml 中配置 Jackson 的 ObjectMapper,但我不知道该怎么做。

最佳答案

我解决了我自己的问题。 首先,我必须在 Tomcat server.xml 连接器中添加relaxedQueryChars='{}'

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" relaxedQueryChars='{}' />

下一步:Spring 不允许 RequestBody 用于 RequestMethod.GET。于是我改成POST,就成功了。因为:

<mvc:annotation-driven /> 

我不需要对 jackson objectmapper 进行任何配置。

关于java - 如何在 spring-servlet.xml 中配置 jackson object-mapper 以进行 @RequestBody 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57112743/

相关文章:

java - 在另一个线程中下载文件并等待主线程中的进度会卡住 JFrame 的渲染

java - 如何在spring mvc中将空数字字段绑定(bind)到默认值0

java - 如果枚举映射键为 null 或未知,则忽略 JSON 反序列化

java - Java 中使用 BigInteger 计算 50 阶乘

java - android 创建项目操作期间无法识别目标 ID

java - System.property 是什么意思?

spring - 如何在 Spring Boot 中处理 HTTP OPTIONS 请求?

java - 带有 JSON 和 XML 的 Spring REST

java - 同一属性上的 @JsonIgnore 和 @JsonProperty

java - 为什么 Jackson ObjectMapper 在将 JSON 字段转换为 Date 对象时出现此错误?无法从 String 反序列化 java.util.Date 类型的值