无法在Java中分析表单数据请求中的类型

无法在Java中分析表单数据请求中的类型,java,spring-boot,multipartform-data,form-data,Java,Spring Boot,Multipartform Data,Form Data,从Android设备检索到Spring boot控制器的HTTP请求时,我在解析表单数据中的类型化对象时遇到了问题 我需要发送一个包含两个文件和一些数据的多部分请求,所以我决定为此使用表单数据 现在,只要随文件一起发送的数据是一个原语,我就可以在我的控制器中解析它,但是如果我尝试发送一个类型(例如List或Animal.class),我会得到一个异常,说明如下内容: 参数不匹配;无法解析为字符串 无法在表单数据中发送复杂对象。如何解决上述问题。我知道这不是一个直接的答案,但它是一个更好的解决方案

从Android设备检索到Spring boot控制器的HTTP请求时,我在解析表单数据中的类型化对象时遇到了问题

我需要发送一个包含两个文件和一些数据的多部分请求,所以我决定为此使用表单数据

现在,只要随文件一起发送的数据是一个原语,我就可以在我的控制器中解析它,但是如果我尝试发送一个类型(例如List或Animal.class),我会得到一个异常,说明如下内容:

参数不匹配;无法解析为字符串


无法在表单数据中发送复杂对象。如何解决上述问题。

我知道这不是一个直接的答案,但它是一个更好的解决方案。您应该将所有数据压缩成具有设置格式的字节数组。序列化需要很长的时间,如果您知道要发送的数据,就不需要使用这样一种非特定的算法,与自己进行序列化相比,这种算法需要很长的时间。 我不知道你在动物类中发送的是什么数据,但假设你发送的是物种(一个字符串变量)、年龄和一个表示动物是否完全发育的布尔值

class Animal {
    /* Fields and Constructors here */

    public static byte[] toByteArray(Animal a) {
        byte[] arr = new byte[a.name.length() + 4 /*(length of array)*/ + 4 /*(the age)*/ + 1 /*(fully-grown)*/];

        arr[0] = a.name.length() >> 24 & 0xff;
        arr[1] = a.name.length() >> 16 & 0xff;
        arr[2] = a.name.length() >> 8 & 0xff;
        arr[3] = a.name.length() & 0xff;

        for (int i = 0; i < a.name.length(); i++) {
            arr[i + 4] = a.name.charAt(i);
        }

        arr[a.name.length() + 4] = a.age >> 24 & 0xff;
        arr[a.name.length() + 5] = a.age >> 16 & 0xff;
        arr[a.name.length() + 6] = a.age >> 8 & 0xff;
        arr[a.name.length() + 7] = a.age & 0xff;

        arr[a.name.length() + 8] = a.grown? 0x1 : 0x0;
    }
}
类动物{
/*字段和构造函数*/
公共静态字节[]toByteArray(a){
byte[]arr=新字节[a.name.length()+4/*(数组长度)*/+4/*(年龄)*/+1/*(完全增长)*/];
arr[0]=a.name.length()>>24&0xff;
arr[1]=a.name.length()>>16&0xff;
arr[2]=a.name.length()>>8&0xff;
arr[3]=a.name.length()&0xff;
for(int i=0;i>24&0xff;
arr[a.name.length()+5]=a.age>>16&0xff;
arr[a.name.length()+6]=a.age>>8&0xff;
arr[a.name.length()+7]=a.age&0xff;
arr[a.name.length()+8]=a.grown?0x1:0x0;
}
}

反序列化也可以这样做,但相反。我不知道我是否忘记了一些强制转换,但我相信你能找到答案:)

多部分/表单数据并不是一种流行的格式。首选使用一个包含所需内容的实体。在控制器中使用@RequestParam(“文件”)多部分文件。我的控制器需要一个@ModelAttribute SomeClass。SomeClass是一个包含两个多部分文件和一个列表变量的类。