java filter jax-rs resteasy query-parameters

java - ¿Cómo se filtra una solicitud que tiene un parámetro no válido en JAX-RS?



filter resteasy (2)

Por "inválido" me refiero a un parámetro que no se espera.

Por ejemplo:

@Path("/") public interface ExampleInterface { @GET @Path("/example") public Response test( @QueryParam("param1") String param1, @QueryParam("param2") String param2 ); }

Y luego llamo ".../example?param3=foo"


Puede verificar el uso de ContainerRequestFilter y comparar los parámetros pasados ​​con los parámetros definidos:

@Provider public class RequestParamFilter implements ContainerRequestFilter { @Context private ResourceInfo resourceInfo; @Context private HttpServletRequest servletRequest; @Override public void filter(ContainerRequestContext requestContext) throws IOException { Set<String> validParams = new HashSet<String>(); Method method = resourceInfo.getResourceMethod(); for (Annotation[] annos : method.getParameterAnnotations()) { for (Annotation anno : annos) { if (anno instanceof QueryParam) { validParams.add(((QueryParam) anno).value()); } } } for (String param : servletRequest.getParameterMap().keySet()) { if (!validParams.contains(param)) { requestContext.abortWith(Response.status(Status.BAD_REQUEST).build()); } } } }

No olvide que ServletRequest # getParameterMap devuelve un mapa que contiene ambos: parámetros de cadena de consulta y parámetros pasados ​​en el cuerpo de la solicitud. Entonces quizás necesite analizar la cadena de consulta usted mismo.

Nota: Esto no acelerará su aplicación.


Gracias por la respuesta aceptada. Es muy útil y también lo uso. Proporciono una versión modificada, con los siguientes cambios:

  • eliminó el servletRequest entrando a través de Annotation de contexto. Esto no es necesario ya que la solicitud es un parámetro del método de filtro en sí.
  • agregó las importaciones, ya que puede haber mucho consumo sobre las diferentes clases con el mismo nombre (Método, Anotación, ContainerRequestContext, ...)
  • también agregó el nombre del parámetro faltante al mensaje de error

-

import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; import java.util.HashSet; import java.util.Set; import javax.ws.rs.QueryParam; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.Context; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.ext.Provider; @Provider public class UnexpectedParameterFilter implements ContainerRequestFilter { @Context private ResourceInfo resourceInfo; @Override public void filter(ContainerRequestContext requestContext) throws IOException { Set<String> validParams = new HashSet<String>(); Method method = resourceInfo.getResourceMethod(); for (Annotation[] annos : method.getParameterAnnotations()) { for (Annotation anno : annos) { if (anno instanceof QueryParam) { validParams.add(((QueryParam) anno).value()); } } } MultivaluedMap<String, String> queryParameters = requestContext.getUriInfo().getQueryParameters(); for (String param : queryParameters.keySet()) { if (!validParams.contains(param)) { requestContext.abortWith(Response.status(Status.BAD_REQUEST).entity("unexpected paramter: "+param).build()); } } } }