POST JSON fails with 415 Unsupported media type, Spring 3 mvc

后端 未结 14 1539
执念已碎
执念已碎 2020-11-22 09:46

I am trying to send a POST request to a servlet. Request is sent via jQuery in this way:

var productCategory = new Object();
productCategory.idProductCategor         


        
相关标签:
14条回答
  • 2020-11-22 10:15

    I believe I ran exactly into the same issue. After countless hours of fighting with the JSON, the JavaScript and the Server, I found the culprit: In my case I had a Date object in the DTO, this Date object was converted to a String so we could show it in the view with the format: HH:mm.

    When JSON information was being sent back, this Date String object had to be converted back into a full Date Object, therefore we also need a method to set it in the DTO. The big BUT is you cannot have 2 methods with the same name (Overload) in the DTO even if they have different type of parameter (String vs Date) because this will give you also the 415 Unsupported Media type error.

    This was my controller method

      @RequestMapping(value = "/alarmdownload/update", produces = "application/json", method = RequestMethod.POST)
      public @ResponseBody
      StatusResponse update(@RequestBody AlarmDownloadDTO[] rowList) {
        System.out.println("hola");
        return new StatusResponse();
      }
    

    This was my DTO example (id get/set and preAlarm get Methods are not included for code shortness):

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class AlarmDownloadDTO implements Serializable {
    
      private static final SimpleDateFormat formatHHmm = new SimpleDateFormat("HH:mm");
    
      private String id;
      private Date preAlarm;
    
      public void setPreAlarm(Date date) { 
        this.preAlarm == date;
      }
      public void setPreAlarm(String date) {    
        try {
          this.preAlarm = formatHHmm.parse(date);
        } catch (ParseException e) {
          this.preAlarm = null;
        } catch (NullPointerException e){
          this.preAlarm = null;
        }
      }
    }
    

    To make everything work you need to remove the method with Date type parameter. This error is very frustrating. Hope this can save someone hours of debugging.

    0 讨论(0)
  • 2020-11-22 10:16

    I faced a similar issue and this is how I fixed it,

    The problem is due to the conversion process from JSON to Java, one need to have the right run time jackson libraries for the conversion to happen correctly.

    Add the following jars (through dependency or by downloading and adding to the classpath.

    <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
    </dependency>
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
    </dependency>
    

    This should fix the problem.

    Complete Code:

    function() {
      $.ajax({
        type: "POST",
        url: "saveUserDetails.do",
        data: JSON.stringify({
          name: "Gerry",
          ity: "Sydney"
        }),
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        success: function(data) {
          if (data.status == 'OK')
            alert('Person has been added');
          else
            alert('Failed adding person: ' + data.status + ', ' + data.errorMessage);
    }
    

    and the controller signature looks like this:

    @RequestMapping(value = "/saveUserDetails.do", method = RequestMethod.POST)
    public @ResponseBody Person addPerson( @RequestBody final  Person person) {
    

    Hope this helps

    0 讨论(0)
  • 2020-11-22 10:21

    I resolved this issue by adding jackson-json data binding to my pom.

    <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.6.3</version>
    </dependency>
    
    0 讨论(0)
  • 2020-11-22 10:23

    I faced this issue when I integrated spring boot with spring mvc. I solved it by just adding these dependencies.

    <dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
    </dependency>
    <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
    </dependency>
    
    0 讨论(0)
  • 2020-11-22 10:24

    1.a. Add following in 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

    1. add jackson library
    0 讨论(0)
  • 2020-11-22 10:29

    In your Model Class add a json property annotation, also have a default constructor

    @JsonProperty("user_name")
    private String userName;
    
    @JsonProperty("first_name")
    private String firstName;
    
    @JsonProperty("last_name")
    private String lastName;
    
    0 讨论(0)
提交回复
热议问题