2017-06-20 103 views
0

我有简单的登录控制器。在它里面,我有一个叫做signIn()的动作方法。我正在提交我的凭证以通过ajax呼叫登录到网站。Spring MVC中不受支持的媒体类型

这是我的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":"[email protected]","password":"12345"} 

并登录控制器的登入()方法的代码是─

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

我已创建简单的人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不支持的媒体类型错误。你能帮我解释为什么这个错误发生了吗?在此先感谢..

+0

@Surely我已经作出这些变化jQuery.ajax({ '类型':类型, 'URL':URL, '报头'?:头标头:{}, '的contentType':contentType中, ' data':JSON.stringify(content), 'success':success, 'error':error }); –

+0

https://stackoverflow.com/questions/7181534/http-post-using-json-in-java。什么是整个信息?你有两个应用程序/ XXX值。你有没有尝试从命令行卷曲? – efekctive

+0

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

回答

0

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

0

使用

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

,因为数据将是UTF编码,你必须使用这个值或者只是删除消耗部分头

0

合剂和内容类型

$.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的情况下不需要使用标题。

0

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

0

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

相关问题