【问题标题】:RestEasy - Mapping list of objects from incoming multipart requestRestEasy - 来自传入多部分请求的对象映射列表
【发布时间】:2017-10-17 19:32:17
【问题描述】:

上传包含以下字段的 Multipart 表单时:

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="info"

[{"foo":"Foo Data","bar":"Bar Data"}]
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="id"

someId
------WebKitFormBoundary7MA4YWxkTrZu0gW--

服务器抛出错误为:

Unable to find a MessageBodyReader for media type: text/plain;charset=us-ascii and class type java.util.List

端点如下所示:

@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public Response bulkUpload(@MultipartForm UploadRequestModel uploadRequest) {
  ...
}

模型用作:

public class UploadRequestModel {

    @FormParam("info")
    private List<InfoModel> info;

    @FormParam("id")
    private String id;

    /**
    * Getters/Setters
    **/
}

public class InfoModel {

  private String foo;

  private String bar;

    /**
    * Getters/Setters
    **/
}

有没有办法将 info 部分解组为模型中的 List

【问题讨论】:

  • 您找到解决方案了吗?
  • 没有希望。继续使用扁平模型而不是嵌套

标签: java multipartform-data resteasy


【解决方案1】:

每当我们在请求正文中发送任何复杂数据时,它都会搜索有助于将请求正文转换为 java 对象的辅助方法。

通过实现这些辅助方法,我们可以达到预期的效果。

正如java doc 所说

@FormParam 绑定请求中包含的表单参数的值 实体主体到资源方法参数。值是 URL 解码的 除非使用 Encoded 注解禁用此功能。默认值 可以使用 DefaultValue 注释指定。如果请求 实体主体不存在或者是不支持的媒体类型,默认 值被使用。注释参数的类型 T 必须:

  1. 成为原始类型
  2. 有一个接受单个字符串参数的构造函数
  3. 有一个名为 valueOf 或 fromString 的静态方法,它接受单个 String 参数(例如,请参见 Integer.valueOf(String))
  4. 是 List、Set 或 SortedSet,其中 T 满足上述 2 或 3。生成的集合是只读的。

例如,我们想要获取 InfoModel 对象的列表。

根据第 4 点,如果我们在 InfoModel 中实现任何辅助方法(valueOf 或 fromString),它应该也能正常工作。但我发现它对我不起作用。

所以我在 ArrayList 上创建了一个包装器,并在 ListWrapper 类中实现了帮助方法 valueOf,如下所示。它对我有用。

import org.codehaus.jackson.map.ObjectMapper;
class UploadRequestModel {

    @FormParam("info")
    private ListWrapper<InfoModel> info;

    @FormParam("id")
    private String id;

    /**
     * Getters/Setters
     **/

    public static class ListWrapper<T> extends ArrayList<T> {
        public static ListWrapper valueOf(String json) {
            ObjectMapper mapper = new ObjectMapper();
            ListWrapper obj = null;
            try {
                obj = mapper.readValue(json, ListWrapper.class);
            } catch (Exception e) {
                obj = new ListWrapper();
            }
            return obj;
        }
    }
}

class InfoModel {

    private String foo;
    private String bar;

    /**
     * Getters/Setters
     **/
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    相关资源
    最近更新 更多