Jersey 1.19在将路径和请求参数注入请求处理程序方法之前对其进行验证

时间:2016-07-13 11:59:49

标签: java jersey

我有以下请求处理程序

@media only screen and (min-device-width: 375px) and (max-device-width: 667px) and (orientation : portrait) {
    .red-fnm placeholder-shown, 
    .red-lnm placeholder-shown, 
    .red-fnm placeholder-shown, 
    .red-mail placeholder-shown {
        display:block;
        font-family:"CamphorStd-Regular", arial, helvetica, sans-serif; color:#e24e36 !important; font-size:24px;
        font-weight: normal;
        background-color:#fcedeb;
        margin-top:-20px;
        paddind-top:-10px;
    }
}

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

2 个答案:

答案 0 :(得分:0)

有过滤器类,它会覆盖ContainerRequestFilter,以便所有请求都会通过该过滤器。并在过滤器类中编写验证逻辑。

例如

  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>

答案 1 :(得分:-1)

正如jan.suppol所暗示的那样。您可能希望使用jersey支持的jsr303实现。您必须包含is covered by the drawer.

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

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

这将收集违规行为并将它们一起发送回客户端。您可能希望编写自己的jersey bean validation framework.以便以可用的方式格式化exeptions。

这是我的一个简单例子。您需要格式化所请求媒体类型的响应。

@Provider
static class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {

    public ConstraintViolationExceptionMapper() {
    }

    @Override
    public Response toResponse(ConstraintViolationException exception) {
        ConstraintViolationErrorResponse entity = ConstraintViolationErrorResponse.from(exception);
        if (logger.isDebugEnabled()) {
            for (ConstraintViolation<?> v : exception.getConstraintViolations()) {
                // Handle your response as needed.
                logger.debug("Validation constraint occurred {} ", v.getMessage());
            }
        }

        return Response.status(Status.BAD_REQUEST).entity(entity).build();
    }
}

请注意,您还可以对正在发布的实体使用@Valid注释,这会将验证委托给实体验证约束。

所以如果你有一个看起来像这样的实体。

公共类Person扩展AbstractDomainEntity {

@NotNull(message = "first name is required")
@Field
private String firstname;
...
}

你可以写一个像这样的帖子方法。

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

如果在这种情况下firstname为null,那么它将抛出约束违规异常。查看ExceptionMapper以查看其中包含的有关该问题的信息。如果您尝试使用表单将消息传播回用户,则该路径可能特别有用。