应用流程: 上图给出了使用其他应用程序REST API的应用程序的概念。假定每个框都由每个单独的REST应用程序公开REST API并使用其他应用程序API组成。 “ C ”是实际的端点,它公开了用于上传文件(.pdf)的API,并由应用程序B通过添加的验证和安全层使用。我的开发工作是针对“ A ”应用程序,除了使用公开的API之外,我对 B 和 C 没有任何控制权B 。
我的开发任务:如上所述,我的任务之一是开发 A (REST应用),该API公开了API以上传带有一些附加业务逻辑的文件,以及将使用 B 应用程序的API,该API会实习生使用 C 应用程序上传文档。
Build.sbt :
val jerseyVersion = "2.23.1"
libraryDependencies ++= Seq(
"org.glassfish.jersey.containers" % "jersey-container-servlet" % jerseyVersion,
"org.glassfish.jersey.media" % "jersey-media-multipart" % jerseyVersion,
"org.glassfish.jersey.media" % "jersey-media-json-jackson" % jerseyVersion,
"org.glassfish.jersey.ext" % "jersey-bean-validation" % jerseyVersion,
"org.glassfish.jersey.core" % "jersey-server" % jerseyVersion,
"org.glassfish.jersey.core" % "jersey-client" % jerseyVersion,
"org.glassfish.jersey.containers" % "jersey-container-grizzly2-http" % jerseyVersion,
"javax.servlet" % "javax.servlet-api" % "3.1.0",
"com.fasterxml.jackson.core" % "jackson-databind" % "2.9.8"
)
代码:
@Path("/resource/document")
@Consumes({MediaType.MULTIPART_FORM_DATA,MediaType.APPLICATION_JSON})
@Produces("application/json")
public Response<String> uploadDocument(@FormDataParam("empData") FormDataBodyPart empJson,
@FormDataParam("source") String source,
@FormDataParam("description") String description,
@FormDataParam("file") InputStream uploadFileInputStream,
@FormDataParam("file") FormDataContentDisposition fileMetaData){
FormDataMultiPart multiPart = new FormDataMultiPart();
final EmployeeDetails empDetails = empJson.getValueAs(EmployeeDetails.class);
multiPart = multiPart.field("empData",empDetails.getName());
multiPart = multiPart.field("country",empDetails.getCountry());
multiPart = multiPart.field("source",source)
.field("sourceDescription", description)
.field("docDate", LocalDate.now().toString())
.field("docLanguage","English")
.field("recDate",LocalDate.now().toString())
.field("additionalInformation",fileMetaData.getFileName())
.field("docName",fileMetaData.getName());
/*FormDataBodyPart bodyPart = new FormDataBodyPart("file",uploadFileInputStream.,MediaType.APPLICATION_OCTET_STREAM);*/
return null;
}
问题:
这是我第一次使用Jersey lib。从上面的代码中可以看到,我已经使用@FormDataParam("file") InputStream uploadFileInputStream
来接收文件输入流,并且需要将其发送到应用程序 B 的api,该API负责其余的工作将文件上传到最终终点。但是,挑战在于如何将其发送到应用程序 B 的上载api。我不想将收到的InputStream存储到运行应用程序 A 的服务器位置的文件中,并创建一个File对象并发送它。有什么方法可以将此InputStream转换为File对象或任何其他对象,以便我可以使用jersey 2客户端将其发送到 B 应用程序的上载API。
让我知道是否需要任何其他信息或代码来帮助我解决问题。
只是一个注释。下面的代码并不完整,因为我被困在将InputStream转换为File并将其发送到B的上传API上。
技术堆栈:
Java 8, IntelliJ SBT版本 球衣2
限制: 我正在使用jersey 2作为服务器和客户端,并且不能像代替jersey那样更改技术堆栈,不能使用Spring Boot或其他任何东西,我必须坚持使用jersey,但是我愿意使用任何版本的Jersey(jersey 1或球衣2)