Java Jersey Jax-RS中@QueryParam的URI匹配

时间:2014-11-20 00:58:16

标签: java jersey jax-rs

如何使用查询参数执行此@Path参数的等效操作?

  

@Path(“/ history / {startDate:[0-9] [0-9] [0-9] [0-9] - [0-1] [0-9] - [0-3] [0-9]} / {endDate:[0-9] [0-9] [0-9] [0-9] - [0-1] [0-9] - [0-3] [0- 9]}“)

哪个匹配此URI:

/history/1914-01-20/2014-01-20/

但现在我需要匹配这个:

/history/123456?end=2024-01-20&start=2014-11-12

此代码有效,但没有针对start参数和end参数的验证:

  

@Path( “/历史”)

     

public Response getHistory(                                     @QueryParam(“start”)字符串开始,

                              @QueryParam("end") String end){ 
  

/ *** foo *** /

     

}

2 个答案:

答案 0 :(得分:0)

您使用的是JAX-RS(或Jersey)的哪个版本?

从版本2开始,您可以使用Bean验证(https://weblogs.java.net/blog/bhaktimehta/archive/2013/10/30/jax-rs-and-bean-validation

或者在您的示例,实体提供商(如

)的情况下更复杂一些

Jax-RS MessageBodyReader

https://blogs.oracle.com/arungupta/entry/jax_rs_custom_entity_providers

但是版本是JAX-RS 2.

答案 1 :(得分:0)

因为我被告知没有"匹配"对于查询参数,我发现了另外两种处理方法:

方法#1:使用正则表达式

//in my includes
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//In my @GET endpoint
Pattern startPattern = Pattern.compile("[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]");
        Matcher startMatcher = startPattern.matcher(assigned);

        if (startMatcher.find()) {
            System.out.println("Matched!");
        } else {
            System.out.println("Did not match!");
        }

方法#2:在您的实施中需要某种数据类型

我无法将此编写为特定于您的实现,但在我的实现中,我需要一个TIMESTAMPTZ用于我的数据库行。当QueryParam在SQL查询期间不匹配时,Jax-RS会抛出错误。