我正在使用Sping Boot 实现一个简单的RESTful服务,其接口由.NET(我认为)客户端定义。它们的参数名称是snake_case
,而不是camelCase
,这显然意味着我需要自定义它们的Map方式。
在JSON输入/输出的情况下,这很好,我刚刚定制了ObjectMapper
,如下所示:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
return objectMapper;
}
这很好。现在我的问题是表单数据。我有一个Spring表单,如下所示:
public class MyForm {
private String myValue;
public String getMyValue() {return myValue;}
public void setMyValue(String myValue) {this.myValue = myValue;}
}
但是我需要接受的请求看起来像:
POST /foo/bar HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
my_value=5
我觉得Spring的binding中一定有一些简单的hook,就像Jackon的ObjectMapper
中的等效设置一样,但我很难找到一个。我在这里能找到的唯一一些相关的帖子是this one, about completely changing the parameter names,其中有一些建议,对于我的用例来说似乎有些矫枉过正。
简单的解决方案是对MyForm
中的字段使用snake case,它工作得很好,但有点难看。
我在其他地方看到的最后一个建议是使用拦截器来修改请求参数,这看起来很简单,但感觉肯定会有异常,使其变得不平凡,我担心将代码隐藏在拦截器中,当你遇到一个模糊的情况时,它真的很难找到。
是否有一些“适当的”Spring Y方式来处理我所错过的问题,或者我只需要选择上述不太完美的解决方案之一?
2条答案
按热度按时间w1e3prcc1#
可能你已经解决了这个问题,我今天在StackOverflow PT上回答了一个问题。
所以我们做个交易
在请求到达控制器之前创建一个要执行的过滤器,并相应地设置参数的格式(在我的场景中,从snake case到camel case)。
光说不练,给我看代码!
snakeConverter
做魔术。在那里,
doFilterInternal
总是在请求到达控制器之前执行,参数以其格式化形式存储在新的Map
中,并通过filterChain.doFilter
转发到控制器。HttpServletRequestWrapper
负责为控制器提供新参数。此代码完全基于azhawkes过滤器。
使用以下URL中的简单控制器测试它:http://localhost:8080/snakecase?foo_bar=123
eivnm1vs2#
只需将其添加到Sping Boot 项目中的
application.properties
即可如果你在寻找一个指南,我从这个Article on BeyondCode得到了这个答案