在IBM Mobilefirst Java HTTP Adapter中上载分段文件

问题描述

我是IBM Mobile-first java适配器的新手,我试图使用Postman将图像文件(Multipart请求)发送到我的java适配器(使用JAX-R),并在Rest API中接收该图像文件,并且将其发送到第三方服务器。

但是,每当我从邮递员访问API时,都会收到415 Unsupported media type错误,我什至尝试在mfpJAXRSApplication类中配置JAX-rs2.0,但这也不起作用。谁能帮我这个忙。

我的主要应用程序类

package com.sample.adapter;

import java.util.logging.Logger;
import com.ibm.mfp.adapter.api.mfpJAXRSApplication;

public class JavaAdapterapplication extends mfpJAXRSApplication{

    static Logger logger = Logger.getLogger(JavaAdapterapplication.class.getName());

    @Override
    protected void init() throws Exception {
        logger.info("Adapter initialized!");
    }

    @Override
    protected String getPackagetoScan() {
        //The package of this class will be scanned (recursively) to find JAX-RS 2.0 resources.
        return getClass().getPackage().getName();
    }

    @Override
    public Set<Class<?>> getClasses() {
        
        
        log.info("********* added this part by following few suggestin of stack overflow ************");
        Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
        resources.add(MultiPartFeature.class);
        addRestResourceClasses(resources);
        return resources;
    }

    /**
     * Do not modify addRestResourceClasses() method. It is automatically populated
     * with all resources defined in the project. If required,comment out calling
     * this method in getClasses().
     */
    private void addRestResourceClasses(Set<Class<?>> resources) {
        log.info("********* added this part by following few suggestin of stack overflow ************");
        resources.add(com.adapter.application.services.TestService.class);
    }
}

我的资源类是当我从代码删除FormDataContentdisposition并仅保留Inputstrem时,我可以访问API,但是一旦添加FormDataContentdisposition,它就会以415不支持媒体类型错误开头。

import java.awt.AlphaComposite;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.http.client.methods.HttpRequestBase;

import com.adapter.util.CRGEHttpRequestGenerator;
import com.adapter.util.CRGELogUtils;
import com.adapter.util.CRGERequestHandler;
import com.adapter.util.CRGEResponseHandler;
import com.ibm.mfp.adapter.api.ConfigurationAPI;
import com.ibm.mfp.adapter.api.OAuthSecurity;
import com.ibm.mfp.server.security.external.resource.AdapterSecurityContext;

import org.glassfish.jersey.media.multipart.FormDataContentdisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.FormDataParam;

@Path("/hi")   
public class TestService extends RequestHandler  {
    @Context
    AdapterSecurityContext securityContext;
    
    @Context
    static ConfigurationAPI configurationAPI;

    static org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(TestService.class.getName());
 

   @POST
@Path("/uploadFeedback")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("*/*")
@OAuthSecurity(enabled=false)
public Response  attachupload( @FormDataParam("file") InputStream uploadedInputStream,@FormDataParam("file") FormDataContentdisposition fileDetail){
    log.info("fileName"+fileDetail);
    return Response.ok().build();
}

Pom.xml

    <properties>
        <!-- Use UTF-8 as the encoding of the adapter -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        
    </properties>

     <dependencies>
        <!-- https://mvnrepository.com/artifact/com.ibm.mfp/adapter-maven-api -->
        <dependency>
            <groupId>com.ibm.mfp</groupId>
            <artifactId>adapter-maven-api</artifactId>
            <version>8.0.2018071507</version>
            <scope>provided</scope>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.0.4.RELEASE</version>
            <type>jar</type>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-io -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.7</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.ibm.mfp/mfp-java-token-validator -->
        <dependency>
            <groupId>com.ibm.mfp</groupId>
            <artifactId>mfp-java-token-validator</artifactId>
            <version>8.0.2017020112</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.ibm.mfp/mfp-security-checks-base -->
        <dependency>
            <groupId>com.ibm.mfp</groupId>
            <artifactId>mfp-security-checks-base</artifactId>
            <version>8.0.2018030404</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>

    
    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpmime</artifactId>
    <version>4.3.1</version>
</dependency>
    
   
   
     <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.7</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>2.7</version>
        </dependency>     

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>com.ibm.mfp</groupId>
                <artifactId>adapter-maven-plugin</artifactId>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>

我想知道为什么服务器无法识别多部分请求,我们是否必须将适配器配置为接受多部分请求,如果是,那么我们如何配置它?任何人都可以通过帮助我来挽救我的生命。

我的应用程序也没有WEB.xml或任何以@ApplicationPath开头的类@H_404_28@

解决方法

您可以使用org.apache.commons.fileupload库。适用于我的IBM MobileFirst适配器的样本代码。 要处理文件,请遵循apache文档。

@POST
@Path("attachment")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadAttachment() {
    try {
        FileUploadUtil fileUploadUtil = new FileUploadUtil();
        List<FileItem> items = new ServletFileUpload(fileUploadUtil.createDiskFileItemFactory())
                .parseRequest(request);
        Optional<FileItem> file = fileUploadUtil.findFileItem(items,"file");
        //Your custom logic ....
    } catch (FileUploadException | IOException | MobileException e) {
        // ....
    }
}

从上下文注入请求的地方:

@Context
private HttpServletRequest request;