MULTIPART_FORM_DATA: No injection source found for a parameter of type public javax.ws.rs.core.Response
MULTIPART_FORM_DATA: Не найден источник внедрения для параметра типа public javax.ws.rs.core.Ответ
Я использую стратегию реализации restful Service на основе Джерси для создания сервиса, который будет использоваться для загрузки файлов. Имя моего класса service: UploadFileService.java (См. Код ниже)
Я получаю следующую ошибку при попытке запустить мой сервер tomcat :
org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. [[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.jerser.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[multipart/form-data], producedTypes=[], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.jerser.service.UploadFileService, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@d3e2d4]}, definitionMethod=public javax.ws.rs.core.Response com.jerser.service.UploadFileService.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=file, defaultValue=null], Parameter [type=class com.sun.jersey.core.header.FormDataContentDisposition, source=file, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}'] at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:528) at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:166) at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:327) at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289) at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286) at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:324) at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:338) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:171) at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:363) at javax.servlet.GenericServlet.init(GenericServlet.java:160) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1176) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1102) at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1009) at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4885) at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5212) at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5207) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
В Интернете я обнаружил множество примеров, показывающих, как загрузить СОСТАВНОЙ файл с помощью RESTful API. Но с тем же решением. Я также не могу запустить этот код. Я думаю, что я делаю что-то не так с файлами JAR. Кто-нибудь, пожалуйста, может мне помочь в этом?
Переведено автоматически
Ответ 1
Избавиться от jersey-multipart-1.18.jar. Это для Jersey 1.x. Добавьте эти два
Для Maven вы бы использовали следующую зависимость (вам не нужно явно добавлять mimepull зависимость, так как она сама ее добавит).
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>2.17</version><!-- Make sure the Jersey version matches the one you are currently using --> </dependency>
Затем вам нужно зарегистрировать MultiPartFeature. Если вы используете ResourceConfig для настройки, вы можете просто сделать
register(MultiPartFeature.class);
Если вы используете web.xml, то вы можете добавить класс как <init-param> в сервлет Jersey
Обратите внимание, что если у вас есть несколько поставщиков, которые вы хотите зарегистрировать, вы можете разделить каждый класс поставщика запятой, точкой с запятой или пробелом / переводом строки. Вы не можете использовать одно и то же значение param-name дважды. Смотрите Ответ Суараба
Обновить
Кроме того, как только вы избавитесь от jersey-multipart-1.18.jar, у вас будут ошибки компиляции для отсутствующих импортированных классов. По большей части имена классов остаются прежними, изменились только пакеты, т.Е.
Если вы используете Dropwizard, вместо добавления jersey-media-multipartони документируют, чтобы вы добавили dropwizard-forms вместо этого. И вместо регистрации MultiPartFeature вам следует зарегистрировать MultiPartBundle
Еще одной возможной причиной этой очень общей ошибки является то, что Jersey выполняет поиск фабрик, связанных с последней аннотацией, только тогда, когда в параметре объявлено несколько фабрик. (См. Отчет об ошибке)
Пока это не будет исправлено, если вы используете какие-либо другие аннотации помимо @FormDataParam, они должны быть последними.
Это работает:
@NotEmpty@FormDataParam("myParam") String myParam
Это не:
@FormDataParam("myParam")@NotEmpty String myParam
Ответ 3
Я тоже получил такое же исключение.Я внес следующие изменения в web.xml
и изменил jersey 2.7 на 2.9 .Я не знаю, какое изменение из этих 2 решило проблему.
Ответ 4
Если кто-то использует аннотацию swagger @FormDataParam with @ApiOperation, она не будет работать (согласно последней версии swagger на данный момент), как упомянуто здесь: