2012-09-10 24 views
10

Estoy tratando de obtener algunos datos de un Formulario con jersey y creo que sería una tarea fácil de lograr, sin embargo, estoy recibiendo un error cuando intento enviar algo.Cómo PUBLICAR un formulario usando Jersey 2.0

Caused by: java.lang.IllegalStateException: The @FormParam is utilized when the content type of the request entity is not application/x-www-form-urlencoded 
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.ensureValidRequest(FormParamValueFactoryProvider.java:126) 
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.getForm(FormParamValueFactoryProvider.java:111) 
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.get(FormParamValueFactoryProvider.java:94) 
at org.glassfish.jersey.server.internal.inject.AbstractHttpContextValueFactory.provide(AbstractHttpContextValueFactory.java:65) 
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:80) 
... 36 more 

Creo que esta es la parte relevante del seguimiento de la pila. Ahora para el código que estoy utilizando:

@POST 
@Path("/delete") 
@Produces("application/json") 
public String delete(@FormParam("id")String id){ 

Y estoy intentando escribir un mensaje utilizando una página HTML prueba como esta:

<form action="<path to the server>/delete" method="post"> 
    primary_id: <input type="text" name="primary_id" /><br /> 
    <input type="submit" value="Submit" /> 
</form> 

que he estado tratando de hacer que funcione, pero ninguna posibilidad. He intentado agregar la anotación @Consumes() con multipart-form-data pero realmente no puedo hacer que funcione. Espero que alguien pueda ayudarme.

+0

tratar Consume (/ aplicación x-www-form-urlencoded) – basiljames

+0

lo he intentado, pero tenían el mismo resultado. – XFCC

Respuesta

9

Gracias a todos por la ayuda. Con un poco de revisión de código encontré el problema. Aunque no creo que nadie más cometa este error en particular, lo publicaré de todos modos para referencia futura.

El problema es que no estoy usando un servidor web estándar. Implementé un servidor netty con Jersey y el problema estaba en esa implementación. El problema era que no estaba pasando los encabezados en la solicitud HTTP a Jersey como debería. Estaba perdiendo el tipo de contenido en el medio de la operación, esto significa que Jersey no pudo identificar el tipo de mensaje.

Por lo tanto, para futuras consultas, para cualquier persona que tenga un problema similar al intentar implementar un servidor no estándar usando jersey: cuando no pase correctamente el tipo de medio (hay un método llamado getMediaType() en ContentRequest clase que se usa, entre otras cosas, para validar Content-Type cuando se usa @FormParam) obtendrá este tipo de Exception.

Una vez más, gracias a todos por la ayuda :)

+0

Encontré útil esta respuesta http://blog.junctiontv.com/wp/?p = 150 – Dudi

+0

¿Puedes dar un ejemplo de cómo lo hiciste? – Wax

+0

bueno, fue hace 5 años y no recuerdo exactamente los detalles. ¿Su pregunta es acerca de atar jersey a netty o simplemente cómo pasé los encabezados? – XFCC

1

Está nombrando su entrada como "primary_id", pero está recibiendo el nombre "id" en su anotación @FormParm. Cambie la identificación y el nombre en su etiqueta de entrada a "id".

Además, si usted está consumiendo application/x-www-form-urlencoded, añadir este atributo a la etiqueta de formulario: enctype = "application/x-www-form-urlencoded"

+0

Estoy muy agradecido por la ayuda pero el "primary_id" fue un error tipográfico. Lo he intentado con curl también. Me estoy poniendo un poco desesperado. También he intentado con enctype = "application/x-www-form-urlencoded". Sin suerte. – XFCC

+0

Extraño ... Asegúrate de que todas las libretas tengan la misma versión (por ejemplo, 1.13). –

+0

en realidad, como dije en el título, estoy usando jersey 2.0. De todos modos, encontré el problema, lo publicaré para referencia futura, aunque realmente no creo que nadie tenga un problema similar :) – XFCC

3

Su código está trabajando bien, excepto necesita cambiar

<input type="text" name="id" /> 

Dado que NO dispone definir @Consumes(), por defecto borrar método consume mediaType="application/x-www-form-urlencoded" .

he probado su código y de que funciona perfectamente bien aquí. Mi sugerencia es verificar los archivos jersey jar. Especialmente el archivo jsersey-server.jar en su carpeta lib.

+0

de hecho, todo lo que dijo era verdad y le agradezco la ayuda. Después de consultar otras clases, encontré el problema. – XFCC

Cuestiones relacionadas