Como faço para recuperar os parâmetros de consulta no Spring Boot?

122

Estou desenvolvendo um projeto usando Spring Boot. Eu tenho um controlador que aceita solicitações GET .

Atualmente, estou aceitando solicitações para os seguintes tipos de URLs:

http: // localhost: 8888 / user / data / 002

mas quero aceitar solicitações usando parâmetros de consulta :

http: // localhost: 8888 / user? data = 002

Aqui está o código do meu controlador:

@RequestMapping(value="/data/{itemid}", method = RequestMethod.GET)
public @ResponseBody
item getitem(@PathVariable("itemid") String itemid) {   
    item i = itemDao.findOne(itemid);              
    String itemname = i.getItemname();
    String price = i.getPrice();
    return i;
}
Mehandi Hassan
fonte
7
@RequestParam(bom ponto de partida: o guia oficial )
kryger

Respostas:

197

Use @RequestParam

@RequestMapping(value="user", method = RequestMethod.GET)
public @ResponseBody Item getItem(@RequestParam("data") String itemid){

    Item i = itemDao.findOne(itemid);              
    String itemName = i.getItemName();
    String price = i.getPrice();
    return i;
}
afraisse
fonte
1
então qual é o URL desse método, você pode dizer? O que devo ter que mudar
Mehandi Hassan
desculpe mano este URL não está funcionando localhost: 8888 / user? data = 001 Eu
digitei
3
Remova value = "/" da anotação de mapeamento de solicitação. A propósito, este é um design realmente pobre. Se você for acessar um item para um usuário, a outra maneira seria user / items / {itemId} .
afraisse
18
Usar @RequestParam as public @ResponseBody item getitem(@RequestParam("data") String itemid){exige que o parâmetro de consulta de dados esteja sempre presente. Em vez disso, se você usar dessa forma public @ResponseBody item getitem(@RequestParam Map<String, String> queryParameters){, os dados serão opcionais
samsri
3
... Eu deveria ter postado uma resposta ao invés de deixar um comentário abaixo da pergunta! : -o
kryger
9

Embora a resposta aceita por afraisse seja absolutamente correta em termos de uso @RequestParam, eu sugiro usar um Optional <>, pois nem sempre é possível garantir que o parâmetro correto seja usado. Além disso, se você precisar de um inteiro ou longo, apenas use esse tipo de dados para evitar a conversão de tipos posteriormente no DAO.

@RequestMapping(value="/data", method = RequestMethod.GET)
public @ResponseBody
Item getItem(@RequestParam("itemid") Optional<Integer> itemid) { 
    if( itemid.isPresent()){
         Item i = itemDao.findOne(itemid.get());              
         return i;
     } else ....
}
Andrew Grothe
fonte
de onde você tirou o opcional?
Joey Gough
1
@JoeyGough introduzido no Java 8. docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Andrew Grothe
2

No Spring boot: 2.1.6, você pode usar como abaixo:

    @GetMapping("/orders")
    @ApiOperation(value = "retrieve orders", response = OrderResponse.class, responseContainer = "List")
    public List<OrderResponse> getOrders(
            @RequestParam(value = "creationDateTimeFrom", required = true) String creationDateTimeFrom,
            @RequestParam(value = "creationDateTimeTo", required = true) String creationDateTimeTo,
            @RequestParam(value = "location_id", required = true) String location_id) {

        // TODO...

        return response;

@ApiOperation é uma anotação que vem da API do Swagger, é usada para documentar as apis.

Shashank
fonte
required = truepor padrão
DV82XL
0

Eu também estava interessado nisso e encontrei alguns exemplos no site Spring Boot.

   // get with query string parameters e.g. /system/resource?id="rtze1cd2"&person="sam smith" 
// so below the first query parameter id is the variable and name is the variable
// id is shown below as a RequestParam
    @GetMapping("/system/resource")
    // this is for swagger docs
    @ApiOperation(value = "Get the resource identified by id and person")
    ResponseEntity<?> getSomeResourceWithParameters(@RequestParam String id, @RequestParam("person") String name) {

        InterestingResource resource = getMyInterestingResourc(id, name);
        logger.info("Request to get an id of "+id+" with a name of person: "+name);

        return new ResponseEntity<Object>(resource, HttpStatus.OK);
    }

Veja aqui também

TKPhillyBurb
fonte