0

我有一个 CXF RS 休息资源,看起来像这样:

public class SomeRestResource {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("path")
    public Response getResource(

        @DecimalMin(value = "0.01", message="Weight should be minimum {value}.")
        @Digits( integer = 5, fraction = 2, message = "Weight should be maximum of {integer} integer and {fraction} fractional digits." )
        @QueryParam("weight") double weight)

        // do some operations with weight here...
        }      
     }

我期望 REST 客户端以xxxxx.yy格式输入权重作为最小值为0.01和最大值为 5 位和 2 个小数的精度数。

当我使用 weight 的值为0测试此 REST 资源时,它给了我一个400 BAD REQUEST消息Weight should be maximum of 0.01这是正确的!

但是,当我将 weight 的值输入为AB时,它在客户端给了我一个404 NOT FOUND,并且失败并出现以下 Java 异常:

Caused by: java.lang.NumberFormatException: For input string: "AB"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1241)
at java.lang.Double.valueOf(Double.java:504)
at org.apache.cxf.common.util.PrimitiveUtils.read(PrimitiveUtils.java:75)
at org.apache.cxf.jaxrs.utils.InjectionUtils.handleParameter(InjectionUtils.java:361)

它不应该将输入类型识别为不是双精度并针对数据类型进行验证吗?我应该怎么做才能为 AB 之类的输入字符串返回 400?

4

1 回答 1

1

对此有一个丑陋的解决方法,即保留 REST 资源中所有查询参数的数据类型,String然后使用正则表达式对这些字符串应用验证。例如,对于上述场景double,最小值为 0.01,最大值为xxxxx.yy格式的 5 位和 2 个小数,可以通过以下方式完成:

public class SomeRestResource {

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("path")
public Response getResource(

    @NotNull @Pattern(regexp = "^[0-9]{0,5}[.]{0,1}[0-9]{0,2}$")
    @QueryParam("weight") String weight)

    // do some operations with weight here...
    }      
 }

现在,如果 REST 客户端输入AB的权重值,它将给出 400 BAD REQUEST。

于 2014-06-04T10:52:05.470 回答