rest - ¿Cómo reparar los parámetros de solicitud de Jersey POST?
warnings (8)
Acabo de tener mi función ajax en JQuery configurada en contentType: "application/x-www-form-urlencoded; charset=UTF-8"
porque con una solución anterior (sin Jersey) tuve algunos problemas de codificación. Cuando lo eliminé, el mensaje desapareció y todo funcionó bien.
Estoy construyendo una API REST muy simple usando Jersey, y tengo una advertencia en mis archivos de registro de la que no estoy seguro.
ADVERTENCIA: Una solicitud POST de servlet al URI http://myserver/mycontext/myapi/users/12345?action=delete contiene parámetros de formulario en el cuerpo de la solicitud, pero el cuerpo de la solicitud ha sido consumido por el servlet o un filtro de servlet accediendo los parámetros de solicitud. Solo los métodos de recursos que usan @FormParam funcionarán como se espera. Los métodos de recursos que consuman el cuerpo de la solicitud por otros medios no funcionarán como se esperaba.
Mi aplicación web solo tiene el servlet Jersey definido, asignado a / myapi / *
¿Cómo puedo detener estas advertencias?
Derecha. Así que he estado sufriendo este problema y he tratado de resolverlo de diferentes maneras, pero no quise cambiar la configuración de mi web.xml, solo porque si estaba probando mi aplicación con Postman funcionaba perfectamente, pero cuando se estaba integrando con la aplicación web falla con el problema mencionado ( A servlet request to the URI {MY_URI} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
Entonces, como se mencionó en @clijk, solo tienes que configurar tus encabezados como:
"Content-Type":"application/json"
"charset":"UTF-8"
y voilá, la advertencia se ha ido.
Gracias
El siguiente thread describe la advertencia que está recibiendo. Parece como si tuviera un filtro definido en su web.xml que está procesando la solicitud antes que Jersey.
En mi caso, he corregido este error cuando cambié la fecha del objeto a cadena en el método.
Error:
@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") Date date) throws Exception {
Fijo
@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") String date) throws Exception {
Esta advertencia es lo único que registra WebComponent, por lo que solo debe iniciar sesión en el nivel de ERROR o desactivar el registro para este componente en su archivo logback.xml o en cualquier lugar donde tenga configurado el registro. No necesita escribir un filtro personalizado para ignorar este mensaje específico ya que no hay otros mensajes registrados desde este componente.
Fragmento de código fuente de org.glassfish.jersey.servlet.WebComponent versión 2.14:
if(!form.asMap().isEmpty()) {
containerRequest.setProperty("jersey.config.server.representation.decoded.form", form);
if(LOGGER.isLoggable(Level.WARNING)) {
LOGGER.log(Level.WARNING, LocalizationMessages.FORM_PARAM_CONSUMED(containerRequest.getRequestUri()));
}
}
El mensaje localizado que se utiliza para este mensaje de advertencia es:
form.param.consumed=A servlet request to the URI {0} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
Desactive el cierre de sesión para WebComponent en su logback.xml de la siguiente manera:
<logger name="org.glassfish.jersey.servlet.WebComponent" level="OFF" additivity="false"/>
Este mensaje está destinado a advertir a los desarrolladores sobre el hecho de que se ha consumido el cuerpo de la entidad de solicitud, por lo que cualquier otro intento de leer el cuerpo del mensaje fallará.
Es seguro ignorar el mensaje o filtrarlo de los registros:
java.util.logging.Logger jerseyLogger =
java.util.logging.Logger.getLogger(WebComponent.class.getName());
jerseyLogger.setFilter(new Filter() {
@Override
public boolean isLoggable(LogRecord record) {
boolean isLoggable = true;
if (record.getMessage().contains("Only resource methods using @FormParam")) {
isLoggable = false;
}
return isLoggable;
}
});
Finalmente me deshice de esto asegurándome de tener Content-Type: application / json en mis encabezados de solicitud (obviamente, en el lado del cliente)
Para mí, la advertencia se mostraba para la aplicación POST / x-www-form-urlencoded. Y estoy usando Spring Boot que tiene un HiddenHttpMethodFilter que hace un getParameter antes que cualquier otra cosa ... Así que terminé haciendo esta desagradable anulación:
@Bean
public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
return new HiddenHttpMethodFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
if ("POST".equals(request.getMethod())
&& request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
filterChain.doFilter(request, response);
} else {
super.doFilterInternal(request, response, filterChain);
}
}
};
}