Estou tentando enviar uma solicitação POST para um servlet. A solicitação é enviada via jQuery desta maneira:
var productCategory = new Object();
productCategory.idProductCategory = 1;
productCategory.description = "Descrizione2";
newCategory(productCategory);
onde newCategory é
function newCategory(productCategory)
{
$.postJSON("ajax/newproductcategory", productCategory, function(
idProductCategory)
{
console.debug("Inserted: " + idProductCategory);
});
}
e postJSON é
$.postJSON = function(url, data, callback) {
return jQuery.ajax({
'type': 'POST',
'url': url,
'contentType': 'application/json',
'data': JSON.stringify(data),
'dataType': 'json',
'success': callback
});
};
Com o firebug, vejo que o JSON é enviado corretamente:
{"idProductCategory":1,"description":"Descrizione2"}
Mas recebo 415 tipos de mídia não suportados. O controlador mvc Spring possui assinatura
@RequestMapping(value = "/ajax/newproductcategory", method = RequestMethod.POST)
public @ResponseBody
Integer newProductCategory(HttpServletRequest request,
@RequestBody ProductCategory productCategory)
Alguns dias atrás, funcionou, agora não é. Vou mostrar mais código, se necessário. obrigado
var productCategory = { idProductCategory: 1, description: "Descrizione2" };
seria mais conciso e fácil de ler? Você precisa dizer ao Spring para aceitarapplication/json
especificamente? Em outras palavras, ele espera que os dados cheguem em um formulário?Respostas:
Isso já aconteceu antes com o Spring @ResponseBody e foi porque não havia nenhum cabeçalho de aceitação enviado com a solicitação. Aceitar cabeçalho pode ser uma dor de conjunto com jQuery, mas isso funcionou para mim fonte
O cabeçalho Content-Type é usado pelo @RequestBody para determinar qual o formato dos dados enviados pelo cliente na solicitação. O cabeçalho de aceitação é usado pelo @ResponseBody para determinar qual formato enviar os dados de volta ao cliente na resposta. É por isso que você precisa dos dois cabeçalhos.
fonte
adicionar tipo de conteúdo à solicitação, conforme
application/json
resolvido o problemafonte
Eu tive um problema semelhante, mas achei que o problema era que havia esquecido de fornecer um construtor padrão para o DTO que foi anotado com @RequestBody.
fonte
Acredito que encontrei exatamente o mesmo problema. Após inúmeras horas de luta com o JSON, o JavaScript e o servidor, encontrei o culpado: no meu caso, eu tinha um objeto Date no DTO, esse objeto Date foi convertido em uma String para que pudéssemos mostrá-lo na exibição com o formato: HH: mm.
Quando as informações JSON estavam sendo enviadas de volta, esse objeto Date String precisava ser convertido novamente em um Date Object completo, portanto, também precisamos de um método para configurá-lo no DTO. O grande problema é que você não pode ter 2 métodos com o mesmo nome (Sobrecarga) no DTO, mesmo se eles tiverem um tipo diferente de parâmetro (String vs Data), pois isso também fornecerá o erro do tipo 415 Mídia não suportada.
Este foi o meu método de controle
Este foi meu exemplo de DTO (os métodos id get / set e preAlarm get não estão incluídos na falta de código):
Para que tudo funcione, é necessário remover o método com o parâmetro Date type. Este erro é muito frustrante. Espero que isso possa economizar horas de depuração para alguém.
fonte
public void setParameters(List<Parameter> parameters)
epublic void setParameters(Parameter... parameters)
métodos em um bean, mudando o último paraaddParameters
resolver a questão para mim.Eu enfrentei um problema semelhante e foi assim que o corrigi,
O problema é devido ao processo de conversão de JSON para Java, é necessário ter as bibliotecas jackson de tempo de execução corretas para que a conversão ocorra corretamente.
Adicione os seguintes jars (por dependência ou baixando e adicionando ao caminho de classe.
Isto deve resolver o problema.
Código completo:
e a assinatura do controlador é assim:
Espero que isto ajude
fonte
jackson-databind
é necessário.Eu enfrentei esse problema quando integrei a bota de mola ao spring mvc. Eu o resolvi apenas adicionando essas dependências.
fonte
Uma pequena nota lateral - deparei com esse mesmo erro ao desenvolver um aplicativo da web. O erro que encontramos, brincando com o serviço com o Firefox Poster, foi que os campos e valores no Json deveriam estar entre aspas duplas. Por exemplo..
No nosso caso, preenchemos o json via javascript, o que pode ser um pouco confuso quando se trata de lidar com aspas simples / duplas, pelo que ouvi.
O que foi dito antes nesta e em outras postagens, como incluir os cabeçalhos 'Aceitar' e 'Tipo de conteúdo', também se aplica.
Espero que ajude.
fonte
Eu consegui descobrir como fazê-lo funcionar. Diga-me caso eu esteja errado. Eu usei apenas uma maneira de serializar / desserializar: removi todas as anotações sobre isso (
@JSONSerialize
e@JSONDeserialize
) e registrei os serializadores e desserializadores naCustomObjectMapper
classe. Não encontrei um artigo explicando esse comportamento, mas resolvi dessa maneira. Espero que seja útil.fonte
Eu tive o mesmo problema. Eu tive que seguir estas etapas para resolver o problema:
1. Verifique se você possui as seguintes dependências:
2. Crie o seguinte filtro:
3. Aplique o filtro acima para as solicitações em web.xml
Espero que isso seja útil para alguém.
fonte
jackson-core
é uma dependência dejackson-databind
, portanto, não há necessidade de adicioná-lo diretamente.Bota de mola + mola mvn
com problema
com solução
fonte
Resolvi esse problema adicionando a ligação de dados jackson-json ao meu pom.
fonte
Na sua Classe Modelo, adicione uma anotação de propriedade json, também tenha um construtor padrão
fonte
Eu tive o mesmo problema. adicionando
para o spring-xml resolveu
fonte
1.a. Adicione o seguinte em applicationContext-mvc.xml
xmlns: mvc = "http://www.springframework.org/schema/mvc" xsi: schemaLocation = " http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc
fonte