2011-04-02 21 views
5

Tengo un problema con la captura de la solicitud PUT enviada al servidor.Spring Framework, habilite el método PUT

Estos son mis métodos:

@RequestMapping(method= RequestMethod.GET) 
public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
    System.out.println("get request"); 
    return "index"; 
} 


@RequestMapping(method= RequestMethod.PUT) 
public String putCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
    System.out.println("put request"); 
    return "index"; 
} 

Cuando tracé la llamada, mi solicitud PUT fue manejado por el método GET y no por método PUT en mi clase .. en salir de la pantalla, que siempre se lee como "llegar solicitud". Revisé el registro del navegador y confirmó que enviaron la solicitud PUT correcta, así que creo que olvidé la configuración de Spring aquí, pero no sé qué es ...

¿Alguien puede ayudarme?

Gracias.

EDIT: Código adicional con la clase:

@Controller 
@RequestMapping(value="/retail/{cid}/master/city") 
public class City { 

    @RequestMapping(value="/foo1", method= RequestMethod.GET) 
    public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
     System.out.println("get request"); 
     return "index"; 
    } 

    @RequestMapping(value="/foo2", method= RequestMethod.PUT) 
    public String putCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
     System.out.println("put request"); 
     return "index"; 
    } 
} 

Edit2: Lo sentimos, parece que no lo hice muy minucioso al examinar el registro .. Cogí esta advertencia dos veces.

WARNING: Error in annotation processing: java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor

ideas para solucionarlo?

+0

Si se invoca 'getCity', entonces la solicitud es un método' GET'. No se requieren configuraciones adicionales, debe enviar el tipo incorrecto de solicitud. ¿Estás seguro de que tu cliente está haciendo lo correcto? – skaffman

+0

sí ... Estoy seguro de que el cliente estaba haciendo lo correcto. Se estaba iniciando sesión en la consola. Intenté con Chrome y Firefox, y ambos enviaron la solicitud PUT. – Magician

+0

Agregue un parámetro 'HttpServletRequest' a' getCity', luego registre 'request.getMethod()', y vea lo que dice. – skaffman

Respuesta

3

Se resuelve ... Este es el método revisado que funciona

 
@Controller 
@RequestMapping(value="/retail/{cid}/master/city") 
public class City { 

    @RequestMapping(method= RequestMethod.GET) 
    public String getCity(@PathVariable(value="cid") String cid, @RequestParam(value="State") Integer state, Model model) { 
    System.out.println("get request"); 
    return "index"; 
    } 

    @RequestMapping(method= RequestMethod.PUT) 
    public String putCity(@PathVariable(value="cid") String cid, @RequestBody CityData state, Model model) { 
    System.out.println(state.getState()); 
    return "index"; 
    } 
} 
 
public class CityData { 
    private String state; 
    public String getState() { 
    return this.state; 
    } 
    public void setState(String state) { 
    this.state = state; 
    } 
} 

Usted podría utilizar @RequestBody String state, pero yo prefiero a crear el objeto CityData debido a que la muestra contiene simplificación de mi código, sólo se para verificar cómo manejar los datos

1

Podría tener algo que ver con el hecho de que no especificó un valor de mapeo. Trate @RequestMapping(value="/foo", ...GET) y @RequestMapping(value="/foo", ...PUT) respectivamente

escribe la documentación:

Si usted tiene un único método por defecto (sin asignación de ruta explícita), a continuación, todas las solicitudes sin un método de mapeado más específica encontrada serán enviados a la misma. Si tiene varios de estos métodos predeterminados, se tendrá en cuenta el nombre del método para elegir entre ellos.

Acerca del error: debe agregar el jar de aopalliance a su classpath.

+0

Definí la asignación solo en el nivel de clase. El método manejará las solicitudes. – Magician

+0

@Rudy Dajoh bueno, inténtalo, podría ser un problema elegir qué método invocar. – Bozho

+0

Ok, lo he probado usando '@ RequestParam', el que se invocaba era getCity, mientras que eliminar todos los parámetros invocaría correctamente putCity sin parámetro. Sin embargo, no puedo capturar los parámetros usando HttpServletRequest. Acabo de ver un error de 'solicitud inválida' usando '@ RequestParam' que puede ser una razón por la cual putCity falló e invocó getCity en su lugar, y puede ser que el principal problema aquí sea porque Java no pudo recuperar ningún parámetro de la solicitud. He intentado con RoR capturar los datos, y RoR pudo recibir todos sus datos de forma correctamente. Entonces, estoy seguro de que el problema radica en Java. – Magician

Cuestiones relacionadas