2014-07-19 16 views
0

我已经泽西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); 
} 

}

回答

1

我终于结束了,通过使用低级别的HttpServletRequest,而不是新泽西州的FormDataParams处理上传的文件解决我的要求,如下:

@POST 
@Path("/upload") 
@Consumes("multipart/form-data") 
@Produces("application/json") 
public FileMetaData uploadFiles(@Context ServletContext servletContext, @Context HttpServletRequest request) { 
    return fileUploadHandler.upload(request, servletContext); 
} 


public FileMetaData upload(HttpServletRequest request, ServletContext servletContext) { 
    FileMetaData fileMetaData = null; 
    boolean isMultipart = ServletFileUpload.isMultipartContent(request); 
    if (isMultipart) { 
     LOGGER.info("About to save file on the server : {}", this.SERVER_UPLOAD_DIRECTORY); 

     DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); 
     File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir"); 
     diskFileItemFactory.setRepository(repository); 
     ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); 
     try { 
      List<FileItem> files = servletFileUpload.parseRequest(request); 
      Iterator<FileItem> iter = files.iterator(); 
      while(iter.hasNext()) { 
       FileItem fileItem = iter.next(); 
       String fileName = fileItem.getName(); 
       if (fileName != null) { 
        fileName = FilenameUtils.getName(fileName); 
       } 
       String fileUploadDirectory = this.SERVER_UPLOAD_DIRECTORY; 
       File uploadDirectory = new File(fileUploadDirectory); 
       if(!uploadDirectory.exists()) { 
        uploadDirectory.mkdir(); 
        LOGGER.info("creating directory {}", uploadDirectory.getAbsolutePath()); 
       } 
       String fileUploadPath = fileUploadDirectory + File.separator + fileName; 
       File fileToStore = new File(fileUploadPath); 
       LOGGER.info("saved file {} on server", fileName); 

       fileItem.write(fileToStore); 
       long fileSize = fileToStore.length(); 
       String size = (fileSize > 1024) ? (fileSize/1024) + "Kb" : fileSize + "b"; 
       fileMetaData = new FileMetaData(fileName, size, true); 
      } 
     } catch (Exception e) { 
      LOGGER.warn("error occurred while saving file to server : {}", e.getStackTrace()); 
      e.printStackTrace(); 
     } 
    } 

    else { 
     LOGGER.info("No files to upload in request"); 
    } 

    return fileMetaData; 
} 

这个解决方案对我来说是完美的,尽管我觉得它是一种围绕我原来的问题进行破解。如果这个解决方案也可以帮助别人,这会让我很开心。 但有人必须提供一种纯粹的泽西岛方式来解决这个问题,而不涉及HttpServletRequest,我会乐意尝试它。 谢谢!

+0

你解决了这个问题吗?我也需要纯球衣解决方案。这是我的问题http://stackoverflow.com/q/31138727/660408 – gkiko

+0

就像我上面提到的,我只管理了一个涉及低级别HttpServletRequest的解决方法。 –

相关问题