简体   繁体   English

Spring MVC中不支持的媒体类型

[英]Unsupported Media Type in Spring MVC

I have simple Login Controller. 我有简单的登录控制器。 With in it, I have one action method called signIn(). 有了它,我有了一个称为signIn()的动作方法。 I am submitting my credential to log into the website through ajax call. 我正在提交凭据以通过ajax调用登录该网站。

This is my ajax caller function- 这是我的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);

where 'person' data like - “人”数据在哪里-

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

And login controller's signIn() method code is- 登录控制器的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";
        }
    }

I have created simple Person POJO class- 我创建了简单的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);
    }

}

Now when i am try to login it gives me 415 Unsupported Media Type error. 现在,当我尝试登录时,它给我415 Unsupported Media Type错误。 Can you help me why this error has occurred??? 您能帮我为什么会发生此错误吗??? Thanks in advance.. 提前致谢..

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

use 采用

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

since the data will be UTF encoded you have to use this value or just remove the consumes part 由于数据将采用UTF编码,因此您必须使用此值或仅删除消耗部分

Mixture of headers and content type 标头和内容类型的混合

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

You pass contentType ='application/x-www-form-urlencoded' . 您传递contentType ='application/x-www-form-urlencoded' You can still use the contentType variable but pass correct value. 您仍然可以使用contentType变量,但可以传递正确的值。 No need to use header in case of contentType. 如果是contentType,则无需使用标头。

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

Thank you. 谢谢。 I have solve this issue. 我已经解决了这个问题。 I have specified <mvc:annotation-driven/> , but i forgot to mentioned which HttpMessageConverter will be used. 我已经指定了<mvc:annotation-driven/> ,但是我忘了提到将使用哪个HttpMessageConverter I need a dependency to Jackson library (jackson-databind) so that I can convert HttpRequestBody to Person object and now, i can take support for MappingJackson2HttpMessageConverter . 我需要对Jackson库的依赖关系(jackson-databind),以便可以将HttpRequestBody转换为Person对象,现在,我可以支持MappingJackson2HttpMessageConverter

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM