Как отфильтровать запрос с недопустимым параметром в JAX-RS?

Под "недействительным" я подразумеваю параметр, который не ожидается.

Например:

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

И затем я называю ".../example?param3=foo"

2 ответа

Вы можете проверить использование ContainerRequestFilter и сравнить переданные параметры с определенными параметрами:

@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());
 }
 }
 }

}
</string></string>

Не забывайте, что ServletRequest # getParameterMap возвращает карту, содержащую как параметры строки запроса, так и параметры, переданные в теле запроса. Поэтому, возможно, вам нужно самостоятельно разобрать строку запроса.

Примечание. Это не ускорит ваше приложение.


Спасибо за принятый ответ. Это очень полезно, и я также использую его. Я предоставляю модифицированную версию со следующими изменениями:

  • удалил servletRequest, входящий через Context Annotation. Это необязательно, так как запрос является параметром самого метода фильтра.
  • добавили импорт, так как может быть много consufsion о разных классах с тем же именем (Method, Annotation, ContainerRequestContext,...)
  • также добавило имя отсутствующего параметра в сообщение об ошибке

-

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());
 }
 }
 }

}
</string,></string></string>

licensed under cc by-sa 3.0 with attribution.