【发布时间】:2016-04-28 23:06:25
【问题描述】:
我正在使用 Spring Boot 实现一个简单的 RESTful 服务,其接口由 .NET(我认为)客户端定义。它们的参数名称是snake_case,而不是camelCase,这显然意味着我需要自定义它们的映射方式。
对于 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 的绑定中必须有一些简单的钩子,就像 Jackon 的 ObjectMapper 中的等效设置,但我正在努力寻找一个。我可以在这里找到的唯一有点相关的帖子是this one, about completely changing the parameter names,其中的一些建议对我的用例来说似乎有些过分了。
简单的解决方案就是对MyForm中的字段使用snake case,效果很好,但是有点丑。
我在其他地方看到的最后一个建议是使用拦截器在进入的过程中修改请求参数,这看起来很简单,但感觉肯定会有例外,使它变得不平凡,而且我担心将代码隐藏在拦截器中会使您在遇到一个不起作用的晦涩案例时很难找到。
是否有一些“正确”的 Spring-y 方式来处理我缺少的这个问题,还是我只需要选择上述不太完美的解决方案之一?
【问题讨论】:
-
嗨,我正在努力解决与您描述的相同的问题。有没有机会分享一个可行的解决方案?
-
对不起,没有。我最终只是让表单具有像 my_value 这样的字段名称,然后是像 getMy_value() 和 setMy_value() 这样的 getter/setter。不是很好,但很有效。
-
是的,我知道它有效,但不是真正的 Java 约定.. 太糟糕了,谢谢!
-
@DaveyDaveDave 我不想这么说,但我做了同样的事情。我的响应就像一个魅力,但没有上述“黑客”的请求也没有骰子。
标签: spring spring-mvc