Java 如何仅为一个方法或控制器类禁用POJOMappingFeature

Java 如何仅为一个方法或控制器类禁用POJOMappingFeature,java,json,rest,jersey,pojo,Java,Json,Rest,Jersey,Pojo,我在我的web.xml中打开了Jersey JSON POJOMappingFeature,以将POJO转换为JSON或从JSON转换为POJO: <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param&g

我在我的web.xml中打开了Jersey JSON POJOMappingFeature,以将POJO转换为JSON或从JSON转换为POJO:

<init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
</init-param>
这适用于所有文件格式,但当我尝试上载JSON文件时,formFile.getValueAs(InputStream.class)抛出一个错误,抱怨字符串无法转换为InputStream。我假设这是因为Jersey自动将JSON文件转换为字符串对象。 那么,我怎样才能防止Jersey仅仅为了这个方法或控制器而这样做呢?我的要求是,我需要将json文件保存为文件本身

我在这方面做了很多尝试,但最终得到的只是关于如何启用POJOMapping的文档,而不是有选择地禁用它。任何帮助都将不胜感激

更新: 我的自定义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);
}
公共类JSONMessageBodyReader实现MessageBodyReader{
私有静态最终记录器log=LoggerFactory.getLogger(JSONMessageBodyReader.class);
@凌驾
公共布尔值可读取(类类型、类型genericType、,
注释[]注释,MediaType(MediaType){
//返回true;
返回mediaType.isCompatible(mediaType.APPLICATION\u JSON\u类型)
||mediaType.isCompatible(mediaType.APPLICATION\u OCTET\u STREAM\u TYPE);
||mediaType.isCompatible(mediaType.TEXT\u HTML\u TYPE);
}
@凌驾
公共对象读取自(类类型、类型genericType、,
注释[]注释,MediaType MediaType,
多值映射HttpHeader,InputStream entityStream)
抛出IOException、WebApplicationException{
if(log.isTraceEnabled()){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
byte[]chunk=新字节[256];
int read=-1;
while((read=entityStream.read(chunk))!=-1){
写(块,0,读);
}
chunk=baos.toByteArray();
字符串实体=新字符串(块);
log.trace(“实体:“+实体”);
返回ObjectMapperFactory.getInstance().readValue(chunk,0,chunk.length,type);
}
返回ObjectMapperFactory.getInstance().readValue(entityStream,类型);
}

}

我最终解决了我的需求,使用较低级别的HttpServletRequest而不是Jersey的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;
}
@POST
@路径(“/upload”)
@使用(“多部分/表单数据”)
@生成(“应用程序/json”)
公共文件元数据上载文件(@Context-ServletContext-ServletContext,@Context-HttpServletRequest-request){
返回fileUploadHandler.upload(请求,servletContext);
}
公共文件元数据上载(HttpServletRequest请求,ServletContext ServletContext){
FileMetaData FileMetaData=null;
布尔值isMultipart=ServletFileUpload.isMultipartContent(请求);
if(isMultipart){
LOGGER.info(“即将在服务器上保存文件:{}”,this.server\u UPLOAD\u目录);
DiskFileItemFactory DiskFileItemFactory=新的DiskFileItemFactory();
filerepository=(File)servletContext.getAttribute(“javax.servlet.context.tempdir”);
diskFileItemFactory.setRepository(存储库);
ServletFileUpload ServletFileUpload=新建ServletFileUpload(diskFileItemFactory);
试一试{
List files=servletFileUpload.parseRequest(请求);
迭代器iter=files.Iterator();
while(iter.hasNext()){
FileItem=iter.next();
字符串文件名=fileItem.getName();
如果(文件名!=null){
fileName=FilenameUtils.getName(fileName);
}
String fileUploadDirectory=this.SERVER\u UPLOAD\u目录;
File uploadDirectory=新文件(fileUploadDirectory);
如果(!uploadDirectory.exists()){
uploadDirectory.mkdir();
info(“创建目录{}”,uploadDirectory.getAbsolutePath());
}
字符串fileUploadPath=fileUploadDirectory+File.separator+fileName;
File fileToStore=新文件(fileUploadPath);
info(“服务器上保存的文件{}”,文件名);
fileItem.write(fileToStore);
long fileSize=fileToStore.length();
字符串大小=(文件大小>1024)?(文件大小/1024)+“Kb”:文件大小+“b”;
fileMetaData=新的fileMetaData(文件名、大小、true);
}
}捕获(例外e){
warn(“将文件保存到服务器时出错:{}”,e.getStackTrace());
e、 printStackTrace();
}
}
否则{
LOGGER.info(“请求中没有要上载的文件”);
}
返回文件元数据;
}
这个解决方案非常适合我,尽管我觉得这是对我最初问题的一种破解。如果这个解决方案也能帮助别人,我会很高兴的。 但是必须有人提供一种纯粹的方法来解决这个问题,而不涉及HttpServletRequest,我非常乐意尝试一下。
谢谢

你解决问题了吗?我也需要纯球衣的解决方案。这就是我上面提到的问题,我只管理了一个涉及低级HttpServletRequest的解决方案。
@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;
}