File upload along with other object in Jersey restful web service
Загрузка файла вместе с другим объектом в веб-службе Jersey restful
Я хочу создать информацию о сотруднике в системе, загрузив изображение вместе с данными о сотруднике. Я могу сделать это с помощью различных вызовов rest, используя jersey. Но я хочу добиться этого одним вызовом rest. Ниже я привожу структуру. Пожалуйста, помогите мне, как поступить в этом отношении.
Однако я могу сделать это, выполнив два разных вызова, но я хочу добиться одним вызовом rest, чтобы я мог получить файл, а также фактические данные сотрудника.
Просим вас помочь в этом отношении.
Переведено автоматически
Ответ 1
У вас не может быть двух Content-Typeфайлов (технически это то, что мы делаем ниже, но они разделены каждой частью multipart, но основной тип - multipart). В основном это то, чего вы ожидаете от своего метода. Вы ожидаете mutlipart и json вместе в качестве основного типа носителя. Employee Данные должны быть частью multipart. Таким образом, вы можете добавить @FormDataParam("emp") для Employee.
FileDataBodyPartfilePart=newFileDataBodyPart("file", newFile("stackoverflow.png")); // UPDATE: just tested again, and the below code is not needed. // It's redundant. Using the FileDataBodyPart already sets the // Content-Disposition information filePart.setContentDisposition( FormDataContentDisposition.name("file") .fileName("stackoverflow.png").build());
Я только что создал простой Employee класс с полем id и name для тестирования. Это работает отлично. Он отображает изображение, печатает расположение содержимого и печатает Employee объект.
Я не слишком знаком с Postman, поэтому я сохранил это тестирование напоследок :-)
Похоже, что он также работает нормально, поскольку вы можете видеть ответ "Cool Tools". Но если мы посмотрим на напечатанные Employee данные, мы увидим, что это значение равно null. Что странно, потому что с клиентским API это работало нормально.
Если мы посмотрим на окно предварительного просмотра, то увидим проблему
Для Content-Type основной части нет emp заголовка. Вы можете видеть, что в клиентском API я явно установил его
Так что, я думаю, это действительно только часть полного ответа. Как я уже сказал, я не знаком с Postman, поэтому не знаю, как установить Content-Types для отдельных частей тела. Значение image/png для изображения было автоматически установлено для меня в части изображения (я предполагаю, что это было просто определено расширением файла). Если вы можете это выяснить, то проблема должна быть решена. Пожалуйста, если вы узнаете, как это сделать, опубликуйте это в качестве ответа.
Как вы можете видеть из клиента Postman, некоторые клиенты не могут установить тип содержимого отдельных частей, включая браузер, в отношении его возможностей по умолчанию при использовании FormData (js).
Мы не можем ожидать, что клиент обойдет это стороной, поэтому то, что мы можем сделать, это при получении данных явно задать Content-Type перед десериализацией. Например
Получение POJO требует немного дополнительной работы, но это лучшее решение, чем заставлять клиента пытаться найти собственное решение.
Другой вариант - использовать строковый параметр и использовать любую библиотеку JSON, которую вы используете, для десериализации строки в POJO (например, Jackson ObjectMapper). С предыдущим вариантом мы просто позволяем Jersey обрабатывать десериализацию, и он будет использовать ту же библиотеку JSON, которую он использует для всех других конечных точек JSON (что может быть предпочтительнее).
Дополнительные сведения
В этих комментариях есть обсуждение, которое может вас заинтересовать, если вы используете соединитель, отличный от используемого по умолчанию HttpURLConnection.
Ответ 2
Вы можете получить доступ к файлу изображения и данным из формы, используя ДАННЫЕ ФОРМЫ, состоящие из нескольких ЧАСТЕЙ, используя приведенный ниже код.
вместо жестко запрограммированного MediaType.MULTIPART_FORM_DATA в вызове POST-запроса.
Причина, по которой это необходимо, заключается в том, что когда вы используете другой соединитель (например, Apache) для клиента Jersey, он не может изменять исходящие заголовки, что требуется для добавления границы к типу содержимого. Это ограничение описано в документации клиента Jersey. Поэтому, если вы хотите использовать другой соединитель, вам нужно вручную создать границу.
Ответ 4
В вашем ApplicationConfig должен быть зарегистрирован файл MultiPartFeature.class из glassfish.jersey.media .. чтобы включить загрузку файла
@javax.ws.rs.ApplicationPath(ResourcePath.API_ROOT) publicclassApplicationConfigextendsResourceConfig { publicApplicationConfig() { //register the necessary headers files needed from client register(CORSConfigurationFilter.class); //The jackson feature and provider is used for object serialization //between client and server objects in to a json register(JacksonFeature.class); register(JacksonProvider.class); //Glassfish multipart file uploader feature register(MultiPartFeature.class); //inject and registered all resources class using the package //not to be tempered with packages("com.flexisaf.safhrms.client.resources"); register(RESTRequestFilter.class); }