如何在spring-servlet.xml中配置杰克逊对象映射器以进行@RequestBody转换?

时间:2019-07-19 12:42:28

标签: java spring-mvc jackson-databind

我想显示一个服务器端ajax数据表。为此,我需要从控制器中获取数据。

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

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

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

我的标题看起来像

  

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

我已经成功使用RequestParam尝试了。但是我的表单包含更多的Filterparams,例如date1,date2,Adress等。因此,变量太多。 我徒劳地注释

consumes=MediaType.APPLICATION_JSON_VALUE

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

在我的 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
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/中进行了测试 但我得到

  

“解析HTTP请求标头时出错。在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义”。

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

1 个答案:

答案 0 :(得分:1)

我解决了自己的问题。 首先,我必须在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进行任何配置。