Spring-MVC 406 não aceitável em vez de resposta JSON

Estou tentando retornar uma resposta JSON com o Spring 3.0.6, mas recebo uma resposta 406 “Not Acceptable”, com a descrição: “O recurso identificado por este pedido só é capaz de gerar respostas com características não aceitáveis ​​de acordo com o solicitar “aceitar” headers (). ”

Eu sei que uma pergunta muito semelhante já foi feita antes, mas não consigo fazer funcionar para o meu projeto, apesar de muitos testes e não entendo o que estou fazendo de errado.

No meu pom.xml Maven eu tenho o seguinte:

 org.codehaus.jackson jackson-mapper-asl 1.8.5 compile   org.codehaus.jackson jackson-core-asl 1.8.5 compile  

No web.xml, faço referência ao webmvc-config.xml e o log confirma que ele está carregado.

  mainServlet org.springframework.web.servlet.DispatcherServlet  contextConfigLocation /WEB-INF/spring/webmvc-config.xml  1  

No webmvc-config.xml eu tenho o seguinte:

       

Meu controlador é:

 @Controller public class ClassifiedController { @RequestMapping(value = "/classified/{idClassified}", headers = "Accept=*/*", method = RequestMethod.GET) @ResponseBody public final Classified getClassified(@PathVariable final int idClassified) { ... 

Eu tentei com ou sem o parâmetro headers com os mesmos resultados. Se eu chamar o URL diretamente com o Firefox, os Cabeçalhos de Solicitação conterão o seguinte (verificado com o firebug):

 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 

Se eu usar o seguinte JQuery:

 $.ajax({ url: '/classified/38001', type: 'GET', dataType: 'json' }); 

Os seguintes headers são enviados:

 Accept: application/json, text/javascript, */*; q=0.01 

Em ambos os casos, o resultado é um erro 406. Eu não sei o que mais devo verificar para que funcione.


UPDATE : Eu decidi depurar através do Spring e descobri que Jackson foi chamado corretamente e no org.codehaus.jackson.map.ser.StdSerializerProvider o método _findExplicitUntypedSerializer contém o seguinte código:

 try { return _createAndCacheUntypedSerializer(runtimeType, property); } catch (Exception e) { return null; } 

Isso é lamentável porque esconde a fonte do problema. Com o depurador, descobri que essa exceção continha uma mensagem de erro muito descritiva:

 Conflicting getter definitions for property "reminded": ClassifiedImpl#isReminded(0 params) vs ClassifiedImpl#getReminded(0 params) 

Agora que vejo a mensagem de erro é um erro bobo e fácil de corrigir, mas sem isso não era tão óbvio. Na verdade, corrigir o problema levou a uma serialização funcional.

Em termos do processamento de MappingJacksonJson , você precisará ter certeza de que o Jackson ObjectMapper suporta seu tipo de object para serialização.

Adicione o seguinte em DispatcherServlet-servlet.xml.

         

Eu tropecei no mesmo erro (406: conteúdo não aceitável) com a anotação Spring MVC e @RestController.

O manipulador de primavera:

 @RequestMapping(value = "/stuff-acknowledgment/{id}", produces ="application/json;charset=UTF-8", headers="Accept=*") public Message acknowledgeStuff(@PathVariable("id") String id, @ModelAttribute("ack") AckBean acquittement) { 

Observação:

  • o URI tem o formulário: http://www.host.com/stuff-acknowledgment/{id}
  • MAS $id tem um formato muito particular: xxxcomplicatedhashxxx.png (ou qualquer extensão que você possa imaginar).

Assim sendo:

O Spring MVC interpreta a extensão e quer produzir um resultado do mesmo tipo MIME (mesmo que eu a defina como variável de caminho), aqui um tipo MIME "image/png" mesmo se eu disser a ele para produzir JSON. Então uma exceção 406 é lançada.

Consertar:

Remova a extensão ".png" no URI, ou remova o PathVariable e coloque-o no corpo, ou adicione um sufixo por trás do pathVariable (não testado, mas deve funcionar também), o objective é evitar uma extensão de arquivo no final do URI.

PS: Eu sei que ele não responde ao problema específico (com a solução na atualização) na pergunta, mas descobri que SO thread ao procurar por esse problema e postar minha correção aqui para o registro, esperando que ele possa ajudar alguém no futuro.

Eu corri para este problema porque os objects que eu queria retornar como JSON não tinham nenhum método getter para suas propriedades. Jackson provavelmente precisa disso. Depois de adicioná-los, funcionou.

embora esse fio seja um pouco velho …

você precisa adicionar o seguinte (dependência maven):

org.codehaus.jacksonjackson-mapper-asl1.9.13