2014-12-28 1 views
6

Sono davvero iniziare a lavorare con i controller per il mio piccola applicazione, e ho questo per ora:controllo Elimina non funziona

@RequestMapping("https://stackoverflow.com/users/{id}") 
public ModelAndView showMemeber(@PathVariable Integer id) { 

    ModelAndView mav = new ModelAndView("user/show"); 

    mav.addObject("title", "Show User"); 
    mav.addObject("user", userService.findById(id)); 
    return mav; 

} 

@RequestMapping(value="https://stackoverflow.com/users/{id}", method=RequestMethod.DELETE) 
public String deleteMemeber(@PathVariable Integer id) { 

    userService.delete(id); 

    return "redirect:users"; 

} 

il primo, funziona correttamente, ma il secondo non lo fa, Ho la seguente vista per il primo controller:

<div class="panel-heading">Personal information</div> 
<div class="panel-body"> 

    <form method="post"> 

    ... 

    <button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-pencil"></span> Edit</button> 
    <button type="submit" class="btn btn-danger" onclick="return confirm('Are you sure you want to delete {{ user.username }}?')"><span class="glyphicon glyphicon-remove"></span> Delete</button> 
    </form> 
</div> 

come si vede, ho due pulsanti qui, uno per modificare l'oggetto e uno per eliminarlo. Una volta cancellato, deve reindirizzare a https://<my domain>/users.

Il problema è che quando clicco su Delete è solo aggiornare la pagina e l'oggetto persistono sul database, cosa c'è di sbagliato qui?

  • cerco inviare una richiesta di DELETE come curl -X "DELETE" http://localhost:8080/my-app/users/18 ma questo non ha funzionato.
+0

Come appare la richiesta quando si fa clic sul pulsante Elimina? Invia veramente una richiesta DELETE per un URL corretto? – slnowak

+0

Non succede niente, nessun cambiamento. –

+1

Non è quello che sto chiedendo. Esegui firebug o qualsiasi altro strumento e guarda quale richiesta stai inviando e su quale URL dopo aver fatto clic sul pulsante. Sono abbastanza sicuro che non invii la richiesta DELETE per una risorsa adeguata. – slnowak

risposta

8

Ci sono un po 'di methods available quando si comunica su HTTP. I più comuni sono GET, PUT, POST e DELETE.

Nel vostro controller si dichiara che ci si aspetta un DELETE-richiesta:

@RequestMapping(value="https://stackoverflow.com/users/{id}", method=RequestMethod.DELETE) 
public String deleteMemeber(@PathVariable Integer id) {...} 

Questo non è supportata dal browser di default - un browser supporta solo POST e GET. Per inviare una richiesta DELETE dal browser è necessario utilizzare JavaScript.

Un'alternativa è quella di utilizzare, ad es. jQuery's ajax-method

$.ajax({ 
    url: '/users/' + someUserId, 
    type: 'DELETE', 
    success: function(result) { 
     // Do something with the result 
    } 
}); 

Un modo di test DELETE-richieste è quella di utilizzare il riccio di comando:

curl -X DELETE "http://myhost:port/users/someUserId" 
+0

In alternativa, modifica 'method = RequestMethod.DELETE' in' method = RequestMethod.POST' e funzionerà. –

+0

@ JoãoMelo - questo è vero ma l'OP aveva più pulsanti e POST era * già usato * dal pulsante * modifica *. – wassgren

+0

@wassgren quando provo quella richiesta, ritorna a me 'Impossibile risolvere l'host 'DELETE'' –

1

Come altri hanno già detto, non sono in realtà l'invio di un HTTP DELETE richiesta. Il tuo pulsante di cancellazione fa parte di un post di un modulo, pertanto quando invii il modulo, effettivamente invia una richiesta HTTP POST. Altri hanno dimostrato alcuni modi per richiamare un DELETE (Ajax e CURL) ma trovo che il modo più semplice sia installare un plug-in sul browser preferito. Se stai usando Chrome puoi provare qualcosa come l'estensione Advanced Rest Client ecc.

0

come altri hanno dichiarato che il tuo modulo html invierà il POST in quanto è la tua azione.

se si desidera mantenere il pulsante e fare una cancellazione senza javascript (chiamata AJAX) allora si dovrebbe provare a cambiare il modello di URL nel lato java e anche mettere il pulsante HTML di eliminazione in una forma separata

@ RequestMapping (value = "/ users/delete/{id}", metodo = RequestMethod.POST)