我有以下请求处理程序
@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;
}
}
我有几个像上面这样的处理程序,它们都验证请求参数和路径参数。我想摆脱请求处理程序中的验证逻辑,并在注入之前在一个地方执行它。
答案 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以查看其中包含的有关该问题的信息。如果您尝试使用表单将消息传播回用户,则该路径可能特别有用。