Suponha que eu tenha uma página que lista os objetos em uma tabela e preciso colocar um formulário para filtrar a tabela. O filtro é enviado como um Ajax GET para um URL assim: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z
E em vez de ter muitos parâmetros no meu controlador, como:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
E supondo que eu tenha o MyObject como:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
Eu quero fazer algo como:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }
É possível? Como eu posso fazer isso?
java
spring-mvc
renanleandrof
fonte
fonte
@ModelAttribute
, Spring MVC Form Handling Example . Basta pesquisar no " Spring MVC form handling " e você terá vários tutoriais / exemplos. Mas não se esqueça de usar a maneira moderna de manipulação de formulários, ou seja, Primavera v2.5 +@ModelAttribute
no Spring MVCRespostas:
Você pode fazer isso absolutamente, basta remover a
@RequestParam
anotação, o Spring vinculará claramente os parâmetros de solicitação à sua instância de classe:fonte
MyObject
isso, da mesma forma que podemos fazer com @RequestParam?MyObject
parâmetros de consulta para aceitar no caso Snake e mapeá-lo para um membro do caso camelMyObject
. Por exemplo,?book_id=4
deve ser mapeado com obookId
membro doMyObject
?Vou adicionar um pequeno exemplo de mim.
A classe DTO:
Solicitar mapeamento dentro da classe do controlador:
Inquerir:
Resultado:
Espero que ajude :)
UPDATE / KOTLIN
Como atualmente estou trabalhando muito com o Kotlin, se alguém quiser definir um DTO semelhante, a classe no Kotlin deve ter o seguinte formato:
Com a
data
classe como esta:o Spring (testado na inicialização) retorna o seguinte erro para solicitação mencionada na resposta:
A classe de dados funcionará apenas no seguinte formulário de parâmetros de solicitação:
Esteja ciente disso!
fonte
Eu tenho um problema muito similar. Na verdade, o problema é mais profundo como eu pensava. Estou usando jquery,
$.post
que usaContent-Type:application/x-www-form-urlencoded; charset=UTF-8
como padrão. Infelizmente, baseei meu sistema nisso e quando precisei de um objeto complexo,@RequestParam
não consegui fazer isso acontecer.No meu caso, estou tentando enviar preferências do usuário com algo como;
No lado do cliente, os dados brutos reais enviados ao servidor são;
analisado como;
e o lado do servidor é;
Tentei
@ModelAttribute
, adicionei setter / getters, construtores com todas as possibilidades,UserPreferences
mas sem chance, pois reconheciam os dados enviados como 5 parâmetros, mas, na verdade, o método mapeado possui apenas 2 parâmetros. Eu também tentei a solução de Biju, no entanto, o que acontece é que, o spring cria um objeto UserPreferences com o construtor padrão e não preenche os dados.Resolvi o problema enviando uma string JSon das preferências do lado do cliente e lida com ele como se fosse uma String no lado do servidor;
cliente:
servidor:
Para resumir, fiz a conversão manualmente dentro do método REST. Na minha opinião, a razão pela qual a primavera não reconhece os dados enviados é o tipo de conteúdo.
fonte
@RequestMapping(method = POST, path = "/settings/{projectId}") public void settings(@PathVariable String projectId, @RequestBody ProjectSettings settings)
Como a pergunta sobre como definir campos obrigatórios aparece em cada postagem, escrevi um pequeno exemplo sobre como definir campos conforme necessário:
fonte
Embora as respostas que se referem a
@ModelAttribute
,@RequestParam
,@PathParam
e os gostos são válidas, há uma pequena pegadinha eu corri para. O parâmetro do método resultante é um proxy que o Spring envolve em seu DTO. Portanto, se você tentar usá-lo em um contexto que exija seu próprio tipo personalizado, poderá obter alguns resultados inesperados.O seguinte não funcionará:
No meu caso, tentar usá-lo na ligação de Jackson resultou em um
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
.Você precisará criar um novo objeto a partir do dto.
fonte
Sim, você pode fazer isso de uma maneira simples. Veja abaixo o código das linhas.
URL - http: // localhost: 8080 / get / request / multiple / param / by / map? Name = 'abc' & id = '123'
fonte
A resposta aceita funciona como um encanto, mas se o objeto tiver uma lista de objetos, não funcionará conforme o esperado, então aqui está a minha solução após algumas escavações.
Seguindo este conselho de discussão , aqui está como eu fiz.
Não é o melhor para depurar sua API com o carteiro, mas está funcionando conforme o esperado para mim.
E aqui o SearchFilterDTO e FilterDTO
fonte