【发布时间】:2014-02-02 11:46:05
【问题描述】:
给定一个 Spring-MVC 控制器方法:
@RequestMapping(value = "/method")
public void method(ParamModel params) { /*...*/ }
带模型类:
public class ParamModel { public int param1; }
以下两个结果符合预期/期望:
- 使用
param1=1:method的请求成功完成。 - 请求
param1=blah:JBWEB000120: The request sent by the client was syntactically incorrect.
不过……
- 如果使用附加参数(例如
nonexistentparam=1)发出请求,没有错误。
如果请求包含不属于此 API 的任何参数,是否有办法确保请求得到验证并被拒绝?
【问题讨论】:
-
我没有看到自己需要这样做,也找不到任何直接解决它的文档,但似乎您可能需要配置(或子类化)容器的
RequestMappingHandlerAdapter. -
如何区分无效请求参数和有效请求参数?请求参数未映射到控制器参数这一事实并不意味着它是无效的请求参数,因为可能有其他组件使用它,例如servlet 过滤器,或者它只是简单地通过并再次呈现在隐藏字段中。
-
@chrylis 这样做的需要是由分离的客户端/服务器开发驱动的。我正在处理服务器端的 API,该 API 可能会发生变化,并且希望客户端请求中断,例如,如果参数被重命名或弃用(而不是默默地忽略它们)。
-
@SteveChambers 如果这是基于 REST 的,处理 API 更改的更简单、更可靠的方法是对您正在使用的媒体类型进行版本控制。
-
@chrylis 不确定我完全理解你的意思,但假设上面的 ParamModel 以某种方式被版本化为 1.0。如果客户端调用了 1.0 版,但错误地传入了不属于 ParamModel 的参数,我希望它报告错误。不确定版本控制如何解决这个问题?
标签: java spring spring-mvc parameters controller