【问题标题】:Unsupported Media Type in Spring MVCSpring MVC 中不支持的媒体类型
【发布时间】:2017-06-20 12:39:43
【问题描述】:

我有简单的登录控制器。在其中,我有一个名为 signIn() 的操作方法。我正在提交我的凭据以通过 ajax 调用登录网站。

这是我的 ajax 调用函数-

var AJAXCaller = function () {
};

AJAXCaller.prototype.call = function (type, uri, header, contentType, content, success, error) {
    var config = new SSKSConfig();
    var url = config.getLocation() + uri;
    return jQuery.ajax({
        'type': type,
        'url': url,
        'headers': header,
        'data': JSON.stringify(content),
        'success': success,
        'error': error
    });
};
var caller= new AJAXCaller();
caller.call('POST', '/login', { 'Content-Type': 'application/json' }, 'application/x-www-form-urlencoded', person, fnSuccess, fnError);

“人”数据在哪里 -

{"emailId":"aaa@gmail.com","password":"12345"}

而登录控制器的signIn()方法代码是-

@PostMapping(value = "/login",consumes = MediaType.APPLICATION_JSON_VALUE)
    public String signIn(@RequestBody Person person) {
        if(person.getEmailId().equals("aaa@gmail.com") && person.getPassword().equals("12345")){
            return "Success";
        }
        else{
            return "Invalid";
        }
    }

我创建了简单的 Person POJO 类-

public class Person implements PersonSupport, AddressSupport {
    private String code;
    private String name;
    private String emailId;
    private String password;
    private String contactNo;
    private final Address address = new Address();

    public Person() {
    }

    @Override
    public void setCode(String code) {
        this.code = code;
    }

    @Override
    public String getCode() {
        return this.code;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public void setContactNo(String contactNo) {
        this.contactNo = contactNo;
    }

    @Override
    public String getContactNo() {
        return contactNo;
    }

    @Override
    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }

    @Override
    public String getPassword() {
        return this.password;
    }

    @Override
    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String getEmailId() {
        return emailId;
    }

    @Override
    public String getRoadNo() {
        return address.getRoadNo();
    }

    @Override
    public String getRoadName() {
        return address.getRoadName();
    }

    @Override
    public String getCity() {
        return address.getCity();
    }

    @Override
    public String getPinCode() {
        return address.getPinCode();
    }

    @Override
    public StateList getStateList() {
        return address.getStateList();
    }

    @Override
    public void setRoadNo(String roadNo) {
        address.setRoadNo(roadNo);
    }

    @Override
    public void setRoadName(String roadName) {
        address.setRoadName(roadName);
    }

    @Override
    public void setCity(String city) {
        address.setCity(city);
    }

    @Override
    public void setPinCode(String pinCode) {
        address.setPinCode(pinCode);
    }

    @Override
    public void setStateList(StateList stateList) {
        address.setStateList(stateList);
    }

}

现在当我尝试登录时,它给了我 415 Unsupported Media Type 错误。你能帮我为什么会发生这个错误???提前谢谢..

【问题讨论】:

  • @Surely 我做了这些更改 jQuery.ajax({ 'type': type, 'url': url, 'headers': header ? header : {}, 'contentType': contentType, '数据':JSON.stringify(内容),'成功':成功,'错误':错误});
  • stackoverflow.com/questions/7181534/…。整个信息是什么?您有两个应用程序/XXX 值。你试过从命令行 curl 吗?
  • 谢谢。我已经解决了这个问题。我已经指定了 ,但我忘了提到将使用哪个 HttpMessageConverter。我需要对 Jackson 库(jackson-databind)的依赖,以便我可以将 HttpRequestBody 转换为 Person 对象,现在,我可以支持 MappingJackson2HttpMessageConverter

标签: java ajax spring spring-mvc


【解决方案1】:

您需要在 jquery ajax 调用中设置dataType: "json"

【讨论】:

    【解决方案2】:

    使用

    @PostMapping(value = "/login",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    

    由于数据将采用 UTF 编码,因此您必须使用此值或仅删除消耗部分

    【讨论】:

      【解决方案3】:

      标题和内容类型的混合

      $.ajax({
          type: type,
          url: url,
          data: JSON.stringify(content),
          contentType: "application/json; charset=utf-8",
          dataType: "json",
       ...
      });
      

      你传递contentType ='application/x-www-form-urlencoded'。您仍然可以使用 contentType 变量,但传递正确的值。在 contentType 的情况下不需要使用 header。

      【讨论】:

        【解决方案4】:

        从请求映射中删除consumes = MediaType.APPLICATION_JSON_VALUE,它应该开始工作了。

        【讨论】:

          【解决方案5】:

          谢谢。我已经解决了这个问题。我已经指定 <mvc:annotation-driven/>,但我忘了提到将使用哪个HttpMessageConverter。我需要对 Jackson 库 (jackson-databind) 的依赖,以便我可以将 HttpRequestBody 转换为 Person 对象,现在,我可以支持 MappingJackson2HttpMessageConverter

          【讨论】:

            猜你喜欢
            • 2013-08-08
            • 2014-02-13
            • 2023-03-04
            • 2017-05-20
            • 2014-11-04
            • 1970-01-01
            • 1970-01-01
            • 2017-09-22
            • 1970-01-01
            相关资源
            最近更新 更多