Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 作为查询参数holder的不可变类-Spring MVC_Java_Spring_Spring Mvc - Fatal编程技术网

Java 作为查询参数holder的不可变类-Spring MVC

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) {

我想使我的查询参数类不可变(通过构造函数设置公共最终字段)。有没有办法通过构造函数强制创建SearchQueryParam实例,而不公开可怕的getter/setter

下面是工作的示例代码:

@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对象是不可变的,则不需要克隆它们)
  • 以字段作为最终字段,以便只能从构造函数设置这些字段

您可以使用WebArgumentResolver进行此操作。 首先,你必须像这样写你自己的解析器

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>