问题描述
我是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;