我已经泽西JSON POJOMappingFeature在我的web.xml打开上进行如下的POJO转换到/自JSON:如何禁用新泽西POJOMappingFeature只是一个方法或控制器类
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
我有一个方法负责文件上传的控制器之一。它采用多部分表单数据,从表单中提取文件输入字段,将其转换为一个InputStream,并将文件保存到磁盘:
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("application/json")
public FileMetaData uploadFiles(FormDataMultiPart formDataMultiPart) {
return new FileUploadHandler(SERVER_FILE_UPLOAD_LOCATION).upload(formDataMultiPart);
}
public FileMetaData upload(FormDataMultiPart formDataMultiPart) {
FormDataBodyPart formFile = formDataMultiPart.getField("files");
ContentDisposition contentDisposition = formFile.getContentDisposition();
return saveFile(formFile.getValueAs(InputStream.class), contentDisposition.getFileName(), formFile.getMediaType().toString());
}
这适用于所有格式的文件,除了当我尝试上传JSON文件中,formFile.getValueAs(InputStream.class)抛出一个错误,抱怨String无法转换为InputStream。我认为这是因为Jersey自动将JSON文件转换为字符串对象。 那么,如何防止泽西岛仅仅为这种方法或控制器做这件事?我的要求是,我需要将json文件保存为文件本身。
我已经尝试过在这方面搜索很多,但所有我最终都是关于如何启用POJOMapping,但不是有选择地禁用它的文档。任何帮助将非常感谢!
UPDATE: 我的自定义化MessageBodyReader看起来像如下:
public class JSONMessageBodyReader implements MessageBodyReader<Object> {
private static final Logger log = LoggerFactory.getLogger(JSONMessageBodyReader.class);
@Override
public boolean isReadable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
// return true;
return mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE)
|| mediaType.isCompatible(MediaType.APPLICATION_OCTET_STREAM_TYPE);
|| mediaType.isCompatible(MediaType.TEXT_HTML_TYPE);
}
@Override
public Object readFrom(Class<Object> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
throws IOException, WebApplicationException {
if (log.isTraceEnabled()) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] chunk = new byte[256];
int read = -1;
while ((read = entityStream.read(chunk)) != -1) {
baos.write(chunk, 0, read);
}
chunk = baos.toByteArray();
String entity = new String(chunk);
log.trace("the entity: " + entity);
return ObjectMapperFactory.getInstance().readValue(chunk, 0, chunk.length, type);
}
return ObjectMapperFactory.getInstance().readValue(entityStream, type);
}
}
你解决了这个问题吗?我也需要纯球衣解决方案。这是我的问题http://stackoverflow.com/q/31138727/660408 – gkiko
就像我上面提到的,我只管理了一个涉及低级别HttpServletRequest的解决方法。 –