【问题标题】:Spring parameter too long弹簧参数过长
【发布时间】:2015-10-06 05:23:02
【问题描述】:
@RequestMapping(value = "/createItem", method = RequestMethod.POST)
    @Override
    public void createItem(@RequestParam(value="userId") String userId, @RequestParam(value="title") String title, @RequestParam(value="subtitle") String subtitle, @RequestParam(value="description") String description, @RequestParam(value="category") String category, @RequestParam(value="datapack") String datapack) {
        this.itemDAO.createItem(userId, title, subtitle, description, category, datapack);
}

我正在使用 Spring 创建 RESTful 应用程序。上面的方法可以正常工作,但是当数据包长于一定长度时会导致错误。错误说...

解析 HTTP 请求标头时出错注意:HTTP 的进一步出现 标头解析错误将记录在 DEBUG 级别。

我需要将数据包作为参数传递,数据包本身将是一个 json 文件,我将其转换为字符串。

数据包文件可能非常复杂和庞大。我该如何解决?

这是请求的示例:

http://localhost:8090/createItem?userId=test&title=test&subtitle=test&description=test&category=test&datapack=
  {
    "CLASS": "com.mincom.ellipse.edoi.ejb.menu_item.MENU_ITEMRec",
    "INSTANCE": {
      "m_creationDate": "20150824",
      "m_creationTime": "001616",
      "m_creationUser": "SR4187",
      "m_lastModDate": "20150824",
      "m_lastModTime": "001616",
      "m_lastModUser": "SR4187",
      "m_menuType": "",
      "m_invokationString": "",
      "primaryKey": {
        "m_uuid": "3b4d95fe3dd3432fb00cde0cc25f903f"
      }
    }
  },
  {
    "CLASS": "com.mincom.ellipse.edoi.ejb.i18n_descriptions.I18N_DESCRIPTIONSRec",
    "INSTANCE": {
      "m_creationDate": "20150824",
      "m_creationTime": "001616",
      "m_creationUser": "SR4187",
      "m_lastModDate": "20150824",
      "m_lastModTime": "001616",
      "m_lastModUser": "SR4187",
      "m_description": "CUSTOM_MENU",
      "primaryKey": {
        "m_locale": "en",
        "m_uuid": "3b4d95fe3dd3432fb00cde0cc25f903f"
      }
    }
  },
  {
    "CLASS": "com.mincom.ellipse.edoi.ejb.top_level_menus.TOP_LEVEL_MENUSRec",
    "INSTANCE": {
      "m_creationDate": "20150824",
      "m_creationUser": "SR4187",
      "m_lastModDate": "20150824",
      "m_lastModTime": "001620",
      "m_creationTime": "001620",
      "m_lastModUser": "SR4187",
      "m_uuid": "3b4d95fe3dd3432fb00cde0cc25f903f",
      "primaryKey": {
        "m_name": "SX"
      }
    }
  }

上面的例子有效,但如果我用更长的 JSON 文件进行测试,它将不起作用。

【问题讨论】:

  • 您使用的是什么应用服务器?是弹簧靴吗?
  • 你如何形成你的http请求?你只是提交一个表单还是由 javaScript 以某种方式生成的?
  • 您要传输的数据有多大?是不是大到必须拆分成多个 HTTP 包?
  • 是的,它的弹簧靴。我用角度形成请求。即使我直接从浏览器形成请求,它仍然不起作用
  • 你知道如何拆分包裹吗?

标签: java spring rest spring-mvc


【解决方案1】:

创建一个控制器方法,该方法应使用 XHR (AJAX) 接收 $http 服务发布的 JSON 数据

@RequestMapping(value = "/savecompany_json", method = RequestMethod.POST)   
public  @ResponseBody String saveCompany_JSON( @RequestBody Company company )   {       
    //
    // Code processing the input parameters
    //  
    return "JSON: The company name: " + company.getName() + ", Employees count: " + company.getEmployees() + ", Headoffice: " + company.getHeadoffice();
}

创建一个映射到 JSON 对象的 POJO

public class Company {

    private String name;
    private long employees;
    private String headoffice;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getEmployees() {
        return employees;
    }
    public void setEmployees(Long employees) {
        this.employees = employees;
    }
    public String getHeadoffice() {
        return headoffice;
    }
    public void setHeadoffice(String headoffice) {
        this.headoffice = headoffice;
    }
}

Source

【讨论】:

    【解决方案2】:

    如果请求非常大(例如发送文件时),您可能需要更改 http 标头中的内容类型。例如(尽管根据您实际发送的内容可能看起来不同):

    $http({
       method: 'POST',
       url: url,
       headers: {
          'Content-Type': 'multipart/form-data'
       },
       data: {
          data: model,
          file: file
       }
    });
    

    如果请求太大而服务器无法接受,您可能需要扩展请求大小限制。如果你使用的是 spring boot,你可以去你的 application.properties 文件(应该位于 src/main/resources 下,但如果它还不存在,请手动创建它)并添加以下属性:

    multipart.maxFileSize=3MB
    multipart.maxRequestSize=3180KB
    

    【讨论】:

    • 这是来自 Angular 的请求吗?
    • 是的,这就是您在 Angular 中执行请求的方式
    【解决方案3】:

    无论如何,您都在使用 POST 请求,因此只需在正文中发送内容类型为 application/x-www-form-urlencoded 的参数,就像普通的表单提交一样,而不是在 URL 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-23
      • 2023-01-05
      • 2019-05-03
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多