загрузить файл с помощью клиента jersey 2: преобразовать из входного потока FormDataParam в файл - PullRequest
0 голосов
/ 08 марта 2019

enter image description here

Поток приложений : Рисунок выше дает представление о приложениях, использующих другие приложения REST API. Предположим, что каждый блок, поскольку каждое отдельное приложение REST предоставляет API REST и использует API других приложений. ' C ' - это фактическая конечная точка, которая предоставляет API для загрузки файла (.pdf) и использовалась приложением B с добавленными проверками и уровнем безопасности. Моя часть разработки предназначена для приложения " A ", и у меня нет никакого контроля над B и C , за исключением использования API, предоставляемого B .

моя задача разработки : Как уже говорилось, моя часть задачи заключается в разработке A (приложение REST), которое предоставляет API для загрузки файла с некоторой добавленной бизнес-логикой и потребляет API приложения B , который будет интернировать, использует приложение 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 для получения потока ввода файла, и мне нужно отправить его в API приложения B , который выполняет всю остальную работу по загрузке файла до конечной конечной точки. Но проблема в том, как мне отправить его в приложение B для загрузки API. Я не хочу сохранять полученный InputStream в файл на сервере, где запущено приложение A , создать объект File и отправить его. Есть ли способ преобразовать этот InputStream в объект File или любой другой объект, чтобы я мог отправить его в API загрузки приложения B , используя клиент jersey 2. Сообщите мне, нужна ли какая-либо дополнительная информация или код, чтобы помочь мне решить проблему. Просто записка. Приведенный ниже код неполон, так как я застрял при преобразовании InputStream в File для отправки его в API загрузки B.

Технический стек :

Java 8, IntelliJ, SBT build, трикотаж 2

ограничение : Я использую майку 2 для сервера и клиента, и я не могу изменить технологический стек, как вместо майки, я не могу использовать Spring Boot или любую другую, и мне нужно придерживаться майки, но я открыт для использования любой версии майки (майка 1 или трикотаж 2)

...