Java Jersey 1.19在将路径和请求参数注入请求处理程序方法之前验证它们

Java Jersey 1.19在将路径和请求参数注入请求处理程序方法之前验证它们,java,jersey,Java,Jersey,我有以下请求处理程序 @GET ResponseEntity getEntity(@PathParam("pathParam") String pathParam, @QueryParam("locale") String locale) { validate(pathParam); validate(locale); ... } 我有几个像上面这样的处理程序,它们都验证请求参数和路径参数。我想去掉请求处理程序中的验证逻

我有以下请求处理程序

@GET
ResponseEntity getEntity(@PathParam("pathParam") String pathParam,
                         @QueryParam("locale") String locale) {
    validate(pathParam);
    validate(locale);
    ...
}

我有几个像上面这样的处理程序,它们都验证请求参数和路径参数。我想去掉请求处理程序中的验证逻辑,并在注入它们之前在一个地方进行验证

Have filter类,该类重写ContainerRequestFilter,以便所有请求都将通过该筛选器。并在filter类中编写验证逻辑

比如说

  public class MyRequestFilter implements ContainerRequestFilter{
      public ContainerRequest filter(ContainerRequest containerRequest) throws WebApplicationException {

            //DO all your validations here
            //throw exception if validation fails
              if(!isValidInputs())
                throw new WebApplicationException("Invalid Inputs");

            //Else the flow is continued and the request will reach its handler method.

        return containerRequest;
      }
  }
在web.xml中,将此类称为请求过滤器之一

<servlet>
  <servlet-name>MyApplication</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
    <param-value>MyRequestFilter</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

<servlet-mapping>
  <servlet-name>MyApplication</servlet-name>
  <url-pattern> /myapplication </url-pattern> 
</servlet-mapping>

正如扬·苏波尔所暗示的那样。您可能希望使用jersey支持的jsr303实现。你必须包括

我发现这是处理值验证的最佳方法

@GET
@Path("{entityId}/ts")
public TimeSeries<Map<Metric, Number>> getTimeSeriesMap(@PathParam("entityId") final Long entityId,
        @QueryParam("c") @NotNull(message = "chronoUnit param 'c' is ia required") final String chronoUnitParam,
        @QueryParam("s") @NotNull(message = "start date 's' is required") final String startDateParam,
        @QueryParam("e") @NotNull(message = "endDate param 'e' is i required") final String endDateParam,
        @QueryParam("tsf") final String timestampFormat) throws StatsException {
你可以这样写一个post方法

@POST
public void save(@Valid Person person) {
...
}

如果firstname在本例中为null,则它将抛出constraintviolation异常。请查看,以查看其中包含的有关此问题的信息。如果您试图使用表单将消息传播回您的用户,则该路径可能特别有用。

如果您可以升级到jersey 2,则可以使用bean validation for it JSR 303
@NotNull(message = "first name is required")
@Field
private String firstname;
...
}
@POST
public void save(@Valid Person person) {
...
}