1

我正在尝试处理带有球衣的 JSON 和 FORM 帖子,并结合 pojo 对象上的 jsr 303 验证

@POST
@Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_HTML})
public Response registration(@Valid User registration) {
    UserServiceWrapper.getImpl().registrateUser(registration);
    return Response.ok(registration).build();
}

目前,json 的一切运行良好,但表单发布失败;

HTTP/1.1 415 不支持的媒体类型

我不知道如何解决这个问题,并将 POJO 对象保留在界面中。任何人的想法?

4

1 回答 1

1

默认的 jersey 2.0 框架似乎不支持此功能,解决此问题的方法是创建您自己的 MessageBodyReader,见下文;

@Provider
public class FormDataReader implements MessageBodyReader<Object> {

    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return mediaType.isCompatible(MediaType.APPLICATION_FORM_URLENCODED_TYPE);
    }

    @Override
    public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException {
        String queryString = IOUtils.toString(entityStream);

        Object result = type.newInstance();
        BeanUtils.copyProperties(result, getUrlParameters(queryString));
        return result;
    }

    public static Map<String, String> getUrlParameters(String queryString)
            throws UnsupportedEncodingException {
        Map<String, String> params = new HashMap<String, String>();
        for (String param : queryString.split("&")) {
            String pair[] = param.split("=");
            String key = URLDecoder.decode(pair[0], "UTF-8");
            String value = "";
            if (pair.length > 1) {
                value = URLDecoder.decode(pair[1], "UTF-8");
            }
            params.put(new String(key), new String(value));
        }
        return params;
    }

}
于 2013-07-31T18:58:06.773 回答