2015-07-28 10 views
6
@RequestMapping(value = {"/abcd", "/employees/{value}/{id}"}) 
public String getEmployees(
     @PathVariable(value = "value") String val, 
     @PathVariable(value = "id") String id, 
     @RequestParam(value = "param", required = false) String value) { 
     // ******** 

} 

Per un url sto passando la variabile percorso e per uno non lo sono. Ma voglio che sia l'url a colpire la stessa API. Come posso ottenerlo?Valore di requestmapping multiplo con variabili di percorso

risposta

1

Non è possibile avere il PathVariables opzionale in Mvc molla. Basta creare 2 metodi per i due Request mappings.

@RequestMapping("/abcd") 
public String getEmployees(@RequestParam(value="param", required=false)String value){} 


@RequestMapping("/employees/{value}/{id}") 
public String getEmployees(@PathVariable(value="value") String val,PathVariable(value="id")String id,@RequestParam(value="param", required=false)String value){} 
5

Non possiamo avere optional path variables, si possono avere due metodi di controllo che possono chiamare lo stesso servizio.

Primo metodo

@RequestMapping("/abcd") 
public String getEmployees(@RequestParam(value="param", required=false)String value){} 

Secondo metodo

@RequestMapping("/employees/{value}/{id}") 
public String getEmployees(@PathVariable(value="value") String val, @PathVariable(value="id") String id, @RequestParam(value="param", required=false) String value){} 

Per @RequestParam possiamo usare,

@RequestParam(value="somevalue",required=false)

per facoltativo params piuttosto che pathVariable

5

Abbiamo appena trovato un modo per farlo senza utilizzare più metodi.

Innanzitutto creare una semplice classe per contenere le variabili di percorso:

public class EmployeesRequest { 
    private String value; 
    private String id; 

    public String getValue() { 
    return this.value; 
    } 

    public void setValue(String value) { 
    this.value = value; 
    } 

    public String getId() { 
    return this.id; 
    } 

    public void setId(String id) { 
    this.id = id; 
    } 
} 

quindi definire il metodo di controllo in questo modo:

@RequestMapping(value={ 
    "/abcd", 
    "/employees/{value}/{id}" 
}) 
public String getEmployees(@RequestParam(value="param", required=false) String param, 
          EmployeesRequest request) { 
    if (request.getValue() != null) { 
    // do something 
    } else { 
    // do something else 
    } 
} 

Primavera mapperà automaticamente tutte le variabili di percorso disponibili alla classe EmployeesRequest. Primavera sarà anche fare questo per tutti i parametri di richiesta in modo da poter semplificare le cose ulteriormente aggiungendo il parametro di richiesta a EmployeesRequest:

public class EmployeesRequest { 
    private String value; 
    private String id; 
    private String param; 

    public String getValue() { 
    return this.value; 
    } 

    public void setValue(String value) { 
    this.value = value; 
    } 

    public String getId() { 
    return this.id; 
    } 

    public void setId(String id) { 
    this.id = id; 
    } 

    public String getParam() { 
    return this.param; 
    } 

    public void setParam(String param) { 
    this.param = param; 
    } 
} 

E poi finalmente:

@RequestMapping(value={ 
    "/abcd", 
    "/employees/{value}/{id}" 
}) 
public String getEmployees(EmployeesRequest request) { 
    if (request.getValue() != null) { 
    // do something 
    } else { 
    // do something else 
    } 
} 

Un ulteriore vantaggio di questa soluzione è che ora puoi supportare entrambe le variabili o richiedere i parametri. Significato tutti questi sarebbe valido:

  • /abcd
  • /abcd?param=123
  • /abcd?value=123&id=456&param=789
  • /employees/123/456
  • /employees/123/456?param=123
+0

questo si adatta alla mia situazione, grazie –

4

ora è possibile avere le variabili percorso opzionale attraverso il supporto per Java 8 Optional . Sarà richiesta almeno la versione 4.x di Spring.

@RequestMapping({"/abcd", "/employees/{value}/{id}"}) 
public String getEmployees(
    @PathVariable("value") Optional<String> val, 
    @PathVariable("id") Optional<String> id, 
    @RequestParam("param") Optional<String> value 
) { 
    // ******** 
} 
Problemi correlati