Java 作为查询参数holder的不可变类-Spring MVC
我想使我的查询参数类不可变(通过构造函数设置公共最终字段)。有没有办法通过构造函数强制创建SearchQueryParam实例,而不公开可怕的getter/setter 下面是工作的示例代码:Java 作为查询参数holder的不可变类-Spring MVC,java,spring,spring-mvc,Java,Spring,Spring Mvc,我想使我的查询参数类不可变(通过构造函数设置公共最终字段)。有没有办法通过构造函数强制创建SearchQueryParam实例,而不公开可怕的getter/setter 下面是工作的示例代码: @RequestMapping(value = "/search", method = GET, produces = APPLICATION_JSON_VALUE) public List<Result> search(SearchQueryParam searchQueryParam) {
@RequestMapping(value = "/search", method = GET, produces = APPLICATION_JSON_VALUE)
public List<Result> search(SearchQueryParam searchQueryParam) {
//do stuff;
}
public class SearchQueryParam {
@DateTimeFormat(iso = DATE_TIME)
private DateTime from;
@DateTimeFormat(iso = DATE_TIME)
private DateTime to;
public DateTime getFrom() {
return from;
}
public void setFrom(DateTime from) {
this.from = from;
}
public DateTime getTo() {
return to;
}
public void setTo(DateTime to) {
this.to = to;
}
}
请尝试下面的代码
public final class SearchQueryParam {
@DateTimeFormat(iso = DATE_TIME)
private final DateTime from;
@DateTimeFormat(iso = DATE_TIME)
private final DateTime to;
public SearchQueryParam(DateTime from, DateTime to) {
this.from = from;
this.to = to;
}
public DateTime getFrom() {
return this.from;
}
public DateTime getTo() {
return this.to;
}
}
下面是一些注释,它们将帮助您理解使类成为不可变的步骤
- 无需克隆输入日期时间参数 (假设您使用的是Joda库,如果Joda DateTime对象是不可变的,则不需要克隆它们)
- 以字段作为最终字段,以便只能从构造函数设置这些字段
public class MySpecialArgumentResolver implements WebArgumentResolver {
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {
if (methodParameter.getParameterType().equals(MySpecialArg.class)) {
return new MySpecialArg("myValue");
}
return UNRESOLVED;
}
}
之后,您需要在spring中注册此解析器
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean id="mySpecialArgumentResolver" class="..MySpecialArgumentResolver ">
</bean>
</mvc:argument-resolvers>
你可以阅读更多细节。在这篇文章中使用了旧式风格,在Spring3.1之后,他们添加了HandlerMethodArgumentResolver,您可以使用它。这里是新版本的示例不确定我是否理解了您的问题:如果您将SearchQueryParam中的属性声明为public(就像您在自己的示例中所做的那样),那么您可以只访问它的值而不需要getter。由于您还将它们声明为“final”,因此在创建后将无法更改值。那么,您自己的示例有什么问题?是什么阻止您使用第二个版本的
SearchQueryParam
?在第二种情况下,由于缺少默认构造函数,Spring无法创建SearchQueryParam。我希望这里是强制Spring使用SaleQueQuePARAM(DATETIME,DATETIME)构造。谢谢您的回答,考虑阅读来改进您的答案。
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean id="mySpecialArgumentResolver" class="..MySpecialArgumentResolver ">
</bean>
</mvc:argument-resolvers>