【问题标题】:RestFul service issueRestFul服务问题
【发布时间】:2013-03-28 21:33:33
【问题描述】:

尝试设置一个更新数据库表的 RESTful 服务组件。尝试同时使用 Spring RestTemplate 和 apache commons restful impl,但似乎都没有工作。

关于使用
选项 1:使用 Spring RestTemplate:导致以下错误
com.fasterxml.jackson.databind.JsonMappingException:无法从 START_ARRAY 令牌中反序列化 java.util.LinkedHashMap 实例
选项 2:使用 org.apache.commons.httpclient.methods.PostMethod;导致以下错误
服务器端错误:
org.codehaus.jackson.JsonParseException:意外字符('

客户端错误: 服务器拒绝此请求,因为请求实体的格式不受所请求方法 () 的请求资源支持。
我的 Restful 服务方法被注释为“Post”并使用“JSON”。我的客户端控制器启动 RestFul 调用,代码如下

    @RequestMapping(value="/update", consumes="application/json")
public void updateMaintReport(
        @RequestBody Map<String, String> formModelData, 
        HttpServletRequest request, 
        HttpServletResponse response) 
        throws IOException,JsonMappingException {
    logger.log(LogLevel.DEBUG, "REACHED method updateMaintReport..");
    System.out.println("Reached method updateMaintReport.....");
    boolean errorEncountered = false;
    ReportingSession repSession = null;
    HttpSession session = request.getSession(false);

    if(session==null) {
        // TODO: code for handling invalid/expired session
    } else {
        repSession = (ReportingSession)session.getAttribute(ReportingWebConstants.REPORTING_SESSION);
        if(repSession==null) {
            errorEncountered = true;
        } 
    }

    if(!errorEncountered) {

        ServiceClient serviceClient = new ServiceClient();

        String servicesUrl = this.environment.getProperty("service_url_reports_data");
        String servicesName = this.environment.getProperty("service_name_reports_update_fnol");
        String serviceUrl = VIPUrlFactory.getServiceUrl(servicesUrl+servicesName);
        logger.log(LogLevel.DEBUG, "For update : serviceUrl: "+serviceUrl);

//Option 1: Using Spring RestTemplate :             
        LinkedMultiValueMap<String,String> headers = new LinkedMultiValueMap<String,String>();
        headers.add("Accept","application/json");
        headers.add("Content-type","application/json");
        List list = new ArrayList<Map<String, String>>(); list.add(formModelData);
        RestTemplate restTemplate = new RestTemplate();
        HttpEntity<List> requestEntity = new HttpEntity<List>(list, headers);

        ResponseEntity<List> fList = restTemplate.exchange(serviceUrl,
                HttpMethod.POST, 
                 requestEntity,
                List.class);


//Option 2: using org.apache.commons.httpclient.methods.PostMethod; -- Will be commented when option 1 block is uncommented     
        serviceClient.setParams(formModelData);
        serviceClient.setServiceUrl(serviceUrl);
        serviceClient.callRestServicePost();

        logger.log(LogLevel.DEBUG, "Posting data to service - to execute the update");

    }

}        

在上面的代码中,选项 1 和选项 2 块不会同时执行。

下面是接受 Restful 调用的代码块,我的服务器端代码。

    @RequestMapping(value = "/update", method = RequestMethod.POST)
public void updateMainRptData(@RequestBody Map<String, String> formModelData) throws ReportingIntegrationException,
        IOException, JsonMappingException {
    String updateStmt = "UPDATE CL_SCRIPTS SET DELETE_IND = #{delete_ind},  SCRIPT_DESC = #{script_desc}, SCRIPT_TXT = #{script_txt}WHERE   COMPANY_CD = #{company_cd} AND SCRIPT_NAME = #{script_name}AND PROMPT_ID = #{prompt_id}";
    ParameterObjectDTO paramObjDTO = new ParameterObjectDTO();

    logger.log(LogLevel.DEBUG,"In Services Web: updateMainRptData()");

    if(!formModelData.isEmpty()) {
        Set<String> keySet = formModelData.keySet();
        StringBuilder sb = new StringBuilder();
        for (String key : keySet) {
            sb.append(key).append(" -- ").append(formModelData.get(key)).append("\n");
        }
        logger.log(LogLevel.DEBUG, sb.toString());
    }

    paramObjDTO.setModalForQuery(formModelData);
    paramObjDTO.setUpdateSqlStmt(updateStmt);
    maintReportingSvc.updateMaintReport(paramObjDTO);

}        

我在浏览器中看到的错误消息没有帮助,但我相信我的 JSON 数据是有效的。任何帮助表示赞赏。谢谢。

【问题讨论】:

  • 在选项 1 中,您将 formModelData 发送到哪里?在我看来,您发送的是一个空列表,但服务器需要一张地图。
  • 感谢您指出这一点。我修改了我的问题以包括 formModelData。我重新部署了我的代码,但我仍然看到选项 1 的 HTTP 404 错误,这是由于错误 com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of START_ARRAY令牌
  • 在选项1中,直接传递模型数据
  • 在选项 1 中,直接传递模型数据:'new http entity(formmodeldata, headers)'。我正在为我的智能手机苦苦挣扎。
  • @amadeus:我进行了您建议的更改,但错误仍然存​​在。错误:org.springframework.web.servlet.FrameworkServlet.processRequest:910 |无法完成请求 org.springframework.web.client.HttpClientErrorException: 404 Not Found

标签: java rest


【解决方案1】:

后来我更改了方法updateMainRptData的签名并添加了returntype和@ResponseBody来解决这个问题。

【讨论】:

    猜你喜欢
    • 2012-02-03
    • 2011-09-30
    • 1970-01-01
    • 2016-12-31
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多