web-dev-qa-db-fra.com

Type de support Spring MVC 415 non pris en charge

J'utilise Spring 3.2 et j'essaie d'utiliser une requête post ajax pour soumettre un tableau d'objets json. Si cela est pertinent, j'ai échappé à tous les caractères spéciaux.

Je reçois un statut HTTP de 415. 

Mon contrôleur est:

@RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json")
    public @ResponseBody String saveProfileJson(@RequestBody String[] profileCheckedValues){
        System.out.println(profileCheckedValues.length);
        return "success";
    }

jquery is:

jQuery("#save").click(function () {
        var profileCheckedValues = [];
        jQuery.each(jQuery(".jsonCheck:checked"), function () {
            profileCheckedValues.Push($(this).val());
        });
        if (profileCheckedValues.length != 0) {
            jQuery("body").addClass("loading");
            jQuery.ajax({
                type: "POST",
                contentType: "application/json",
                url: contextPath + "/sample/save-profile",
                data: "profileCheckedValues="+escape(profileCheckedValues),
                dataType: 'json',
                timeout: 600000,
                success: function (data) {
                    jQuery('body').removeClass("loading");
                },
                error: function (e) {
                    console.log("ERROR: ", e);
                    jQuery('body').removeClass("loading");
                }
            });
        }
    });

et un exemple d'un des objets du tableau que je publie est le json suivant: 

{
  "id": "534213341",
  "name": "Jack Lindamood",
  "first_name": "Jack",
  "last_name": "Lindamood",
  "link": "https://www.facebook.com/jack",
  "username": "jack",
  "gender": "male",
  "locale": "en_US",
  "updated_time": "2013-07-23T21:13:23+0000"
}

L'erreur est:

The server refused this request because the request entity is in a format not supported by the requested resource for the requested method

Pourquoi cette erreur se produit-elle, est-ce que quelqu'un le sait?

13
jackyesind

Vous pouvez essayer avec HttpServletRequest. ça n'a pas de problème

  @RequestMapping(value = "/save-profile", method = RequestMethod.POST,consumes="application/json",headers = "content-type=application/x-www-form-urlencoded")
    public @ResponseBody String saveProfileJson(HttpServletRequest request){
       System.out.println(request.getParameter("profileCheckedValues"));
        return "success";
    }
8
muthu

1) Ajoutez les dépendances suivantes

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>${jackson-version}</version> // 2.4.3
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson-version}</version> // 2.4.3
</dependency>

2) Si vous utilisez une annotation @RequestBody dans la méthode du contrôleur, assurez-vous d’avoir ajouté ce qui suit dans le fichier xml

<mvc:annotation-driven />

Cela devrait résoudre le problème du code d'état 415.

4
Swapneel

Vous devrez ajouter jackson et jackson-databind au classpath. Le printemps le prendra en utilisant MappingJacksonHttpMessageConverter

MappingJacksonHttpMessageConverter

Une implémentation HttpMessageConverter capable de lire et d'écrire JSON à l'aide de ObjectMapper de Jackson. Le mappage JSON peut être personnalisé selon les besoins en utilisant les annotations fournies par Jackson. Lorsqu'un contrôle supplémentaire est nécessaire, un ObjectMapper personnalisé peut être injecté via la propriété ObjectMapper dans les cas où des sérialiseurs/désérialiseurs JSON personnalisés doivent être fournis pour des types spécifiques. Par défaut, ce convertisseur prend en charge (application/json).

3
Bart

J'ai eu consume="application/json" dans ma configuration de mappage de demande qui attend une entrée json. Lorsque j'ai envoyé une demande qui n'est pas une entrée JSON, Spring s'est plaint du type de support 415 non pris en charge. Donc, enlever le consume="application/json" a fonctionné pour moi. Examinez donc l'entrée de la demande et le type de support accepté dans la signature de votre méthode de contrôleur Spring. Une non-concordance générerait l'erreur 415. Ce sera probablement la raison du problème.

1
Lucky

J'ai eu le même problème. J'ai dû suivre ces étapes pour résoudre le problème:

1. Assurez-vous que vous avez les dépendances suivantes:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson-version}</version> // 2.4.3
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson-version}</version> // 2.4.3
    </dependency>

2. Créez le filtre suivant:

    public class CORSFilter extends OncePerRequestFilter {

        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response, FilterChain filterChain)
                throws ServletException, IOException {

            String Origin = request.getHeader("Origin");
            Origin = (Origin == null || Origin.equals("")) ? "null" : Origin;
            response.addHeader("Access-Control-Allow-Origin", Origin);
            response.addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, DELETE, OPTIONS");
            response.addHeader("Access-Control-Allow-Credentials", "true");
            response.addHeader("Access-Control-Allow-Headers",
                    "Authorization, Origin, content-type, accept, x-requested-with");

            filterChain.doFilter(request, response);
        }
    }

3. Appliquez le filtre ci-dessus pour les demandes dans web.xml

    <filter>
        <filter-name>corsFilter</filter-name>
        <filter-class>com.your.package.CORSFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>corsFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

J'espère que cela est utile à quelqu'un.

0
Manoj Shrestha

J'ai eu le même problème, je viens d'évoquer la ligne de code ci-dessous dans le fichier spring-servlet.xml, c'était presque à la fin de ce fichier xml. Ça a marché. <mvc:annotation-driven />

0
Jitendra Tumulu

essayez de changer json en application/json pour le type de données. Et à quoi ressemble votre JSON est-il valide ? Je n’ai jamais vu json converti en String [] auparavant, c’est donc aussi le problème.

0
NimChimpsky