未指定@DefaultValue 时@QueryParam 的默认值是什么?

What are the default values for @QueryParam when @DefaultValue is not specified?

例如,具有以下 Java 剩余定义:

@GET
@Path("/something")
public String somthing(
    @QueryParam("valString") String valString,
    @QueryParam("valInt") int valInt,
    @QueryParam("valBool") boolean valBool
) {
  ...
}

和调用:

curl -X GET 127.0.0.1/something

如果没有在调用中指定参数值会是什么? (valString=?, valInt=?, valBool=?)

值将为 null0false,即这些类型的未初始化变量的默认值。如果客户端没有把参数放在 URL 中并且服务没有指定默认值,服务将得到的是 Java 个未初始化变量的默认值。

简答

参数值将为:

  • valString: null
  • valInt: 0
  • valBool: false

答案有点长

引用 Java EE 7 tutorial about extracting request parameters:

If @DefaultValue is not used in conjunction with @QueryParam, and the query parameter is not present in the request, the value will be an empty collection for List, Set, or SortedSet; null for other object types; and the default for primitive types.

原始类型的默认值在 Oracle 的 Java Tutorials 中描述:

 Primitive       Default Value
-------------------------------
 byte            0
 short           0
 int             0
 long            0L
 float           0.0f
 double          0.0d
 char            '\u0000'
 boolean         false

如您所知,可以使用 @DefaultValue 注释更改此行为,如下所示:

@GET
@Path("/foo")
public String myMethod(@DefaultValue("foo") @QueryParam("valString") String valString,
                       @DefaultValue("1") @QueryParam("valInt") int valInt,
                       @DefaultValue("true") @QueryParam("valBool") boolean valBool) {
    ....
}