有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有jquery的java 415(不支持的媒体类型)

我不熟悉使用RESTful API,我不知道为什么它会显示这个错误。 我通过jQuery发布这些值。我还需要做点别的吗?这是我的jQuery代码:

更新:现在显示405(不允许使用方法)

 $(document).ready(function(){ 


$("#patsubmit").click(function() {
    var firstName = $("#firstName").val();
    var lastName = $("#lastName").val();
    var mobileNumber = $("#mobileNumber").val();
    var emailId = $("#emailId").val();

   var dataString = '{"firstName":"'+ firstName + '","lastName":"' + lastName + '","mobileNumber":"' + mobileNumber + '", "emailId":"' + emailId+'"}';
   console.log(dataString); 
   if(firstName=='' )
    {
alert("nothing in it");
    }
    else
    {
    $.ajax({
    type: 'POST',
     url : '/geniedoc/api/patient/register',
     data: dataString,
     contentType: 'application/json',
     dataType: 'json',
     headers: {'Content-Type':'application/json'}
    success: function(){ // Uncaught SyntaxError: Unexpected identifier
console.log();
   }
});}
    return false;
    });

});

这是我的JavaAPIMAIN_PATIENT=api/patientRestURIConstants.REGISTER=register

@RestController
@RequestMapping(value = RestURIConstants.MAIN_PATIENT)
public class PatientRestController extends AbstractController implements RestURIConstants, GenieDocConstants{

    private static final Logger logger = Logger.getLogger(UserRestController.class);

    @RequestMapping(value = RestURIConstants.REGISTER, method = RequestMethod.POST, consumes ="application/json")
    public @ResponseBody ModelMap registerPatient(HttpServletRequest  request, @RequestBody PatientVo patientVo){
        logger.info("registerPatient : Start");
        long startTime = System.currentTimeMillis();
        ModelMap map = new ModelMap();
        PatientVo patVo;
        try {
            if(patientVo.getFirstName() == null) {
                map.addAttribute(STATUS_CODE, FAILURE);
                map.addAttribute(STATUS_MESSAGE, this.env.getProperty(MESSAGE_FIRST_NOT_EMPTY));
            } else if(patientVo.getEmailId() == null) {
                map.addAttribute(STATUS_CODE, FAILURE);
                map.addAttribute(STATUS_MESSAGE, this.env.getProperty(MESSAGE_EMAIL_NOT_EMPTY));
            } else if(patientVo.getEmailId() == "") {
                map.addAttribute(STATUS_CODE, FAILURE);
                map.addAttribute(STATUS_MESSAGE, this.env.getProperty(MESSAGE_EMAIL_NOT_EMPTY));
            } else if (patientVo.getMobileNumber() == null) {
                map.addAttribute(STATUS_CODE, FAILURE);
                map.addAttribute(STATUS_MESSAGE, this.env.getProperty(MESSAGE_MOBILE_NOT_EMPTY));
            } else {
                patVo = this.patientManagementService.provisionPatient(patientVo);
                if (patVo != null) {
                    map.addAttribute("patientId", patVo.getEmailId());
                    map.addAttribute(STATUS_CODE, SUCCESS_STATUS_CODE_REGPATIENT);
                    map.addAttribute(STATUS_MESSAGE, this.env.getProperty(SUCCESS_STATUS_CODE_REGPATIENT));

                } else {
                    map.addAttribute(STATUS_CODE, ERROR_STATUS_CODE_REG);
                    map.addAttribute(STATUS_MESSAGE, this.env.getProperty(ERROR_STATUS_CODE_REG));
                }
            }
        } catch (MongoDBDocumentNotFoundException e) {
            map.addAttribute(STATUS_CODE, ERROR_STATUS_CODE_REGPATIENT);
            map.addAttribute(STATUS_MESSAGE,this.env.getProperty(ERROR_STATUS_CODE_REGPATIENT));
            logger.error("Error : " + e.getMessage());
            //e.printStackTrace();
        } catch (UserAreadyExsistException e) {
            map.addAttribute(STATUS_CODE, ERROR_STATUS_CODE_REGPATIENT);
            map.addAttribute(STATUS_MESSAGE, this.env.getProperty(ERROR_STATUS_CODE_REGPATIENT));
            logger.error("Error : " + e.getMessage());
            //e.printStackTrace();
        }
        logger.debug("Exit: Total Time Taken: "+ (System.currentTimeMillis() - startTime));
        return map;
    }

共 (3) 个答案

  1. # 1 楼答案

    您需要将内容类型标题设置为应用程序/json

    $.ajax({
        type: 'POST',
        url: '/geniedoc/api/patient/register',
        data: dataString,
        headers: {
            'Content-Type':'application/json'
        }
       .....
    }
    

    在您正在定义的spring控制器中,只接受MIME类型application/json的内容。由于标准内容类型text/plain,Spring控制器不接受您的请求并发回状态代码415(媒体类型不受支持)

    编辑:如user6409738所述,您需要以json格式发送数据。否则,Spring控制器将导致异常解析主体

    例如,Yagnesh Agola发布的解决方案

    var dataString = '{"firstName":"'+ firstName + '","lastName":"' + lastName + '","mobileNumber":"' + mobileNumber + '","emailId":' + emailId+'"}'; 
    

    这取决于你的PatientVo课程是什么样子

  2. # 2 楼答案

    1. 使用jQuery Ajax时添加contentType参数
    $.ajax({
      type : "POST",
      contentType : 'application/json',
      url : "/geniedoc/api/patient/register",
      data : JSON.stringify({"param1" : "param1", "param2":2})
    })
    
    1. 在您的请求映射定义中删除consumer=“application/json”(这不是必需的,SpringMVC将自动检测右转换器)

    由于您在springMVC控制器中使用了@RequestBody,因此springMVC将使用RequestResponseBodyMethodProcessor转换参数,后者使用默认转换器来解析参数。默认转换器列表为:

    public RequestMappingHandlerAdapter() {
            StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
            stringHttpMessageConverter.setWriteAcceptCharset(false);  // see SPR-7316
    
            this.messageConverters = new ArrayList<HttpMessageConverter<?>>(4);
            this.messageConverters.add(new ByteArrayHttpMessageConverter());
            this.messageConverters.add(stringHttpMessageConverter);
            this.messageConverters.add(new SourceHttpMessageConverter<Source>());
            this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());
        }
    

    对于您的情况,MappingJackson2HttpMessageConverter将用于解析参数。这里是MappingJackson2HttpMessageConverter的定义,它需要MediaType的application/json

    public MappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
        super(objectMapper, MediaType.APPLICATION_JSON_UTF8,
                new MediaType("application", "*+json", DEFAULT_CHARSET));
    }
    
  3. # 3 楼答案

    从客户端发送到服务器的数据不是JSON格式

    var dataString = 'firstName='+ firstName + '&lastName=' + lastName + '&mobileNumber=' + mobileNumber + '&emailId=' + emailId;   
    

    上面的行用于向服务器发送数据字符串,该字符串不是JSON格式,而是简单的查询字符串

    您可以将上面的字符串转换为JSON格式

    var dataString = '{"firstName":"'+ firstName + '","lastName":"' + lastName + '","mobileNumber":"' + mobileNumber + '","emailId":"' + emailId+'"}'; 
    

    您可以使用下面的代码直接提交JSON格式的表单数据

    var formData = JSON.stringify($("#myForm").serializeArray());