未找到 Multipart 功能的注入源
No injection source found for Multipart feature
当我尝试将我的 Maven 项目部署到 Glassfish 5 时,出现以下错误:
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.test.Resources.AccountResource.addProfilePicture(java.io.InputStream,org.glassfish.jersey.media.multipart.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.test.Resources.AccountResource, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@1efcbc1f]}, definitionMethod=public javax.ws.rs.core.Response com.test.Resources.AccountResource.addProfilePicture(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=profilePicture, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=profilePicture, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']. Please see server.log for more details.
这是导致问题的代码:
@POST
@Path("addProfilePicture")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response addProfilePicture(@FormDataParam("profilePicture") InputStream pic,
@FormDataParam("profilePicture") FormDataContentDisposition formDataContentDisposition){
return Response.ok().build();
}
我的web.xml
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
根据类似的答案,我应该添加maven依赖并注册MultiPartFeature
。
如你所见,我都做了。
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> classes = new HashSet<>();
classes.add(MultiPartFeature.class);
System.out.println("added multipart feature");
classes.add(AccountResource.class);
return classes;
}
}
这是我的 Maven 依赖项:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
</dependencies>
我已经尝试将 scope
更改为 provided
并使用 ResourceConfig
而不是 Application
。
事情是这样的。您有两种不同的应用程序配置:web.xml 和 ApplicationConfig
class。这些是完全独立的配置,它们本身都是有效的。 ApplicationConfig
class 是注册 MultiPartFeature
的那个,但似乎正在使用的配置是 web.xml。我从未真正测试过当您有两个不同的应用程序配置时会发生什么,但似乎您的 web.xml 优先。在您的 web.xml 中,您没有配置 MultiPartFeature
.
如果您只想使用 web.xml
,那么您可以查看 了解如何配置它。
但是您可以只删除整个 web.xml。这将导致 ApplicationConfig
踢它。但请注意两个区别:ApplicationConfig
中的 @ApplicationPath
与 web.xml 中的 url-mapping
一样。因此,如果您删除 web.xml,那么基本路径将只是 /
(或什么都没有),而不是像 web.xml
中那样的 /webapi
如果您决定删除 web.xml,我建议您使用 ResourceConfig
而不是 Application
。您可以从
中获得有关此 class 和此 post 中不同配置可能性的一些有用信息
当我尝试将我的 Maven 项目部署到 Glassfish 5 时,出现以下错误:
[[FATAL] No injection source found for a parameter of type public javax.ws.rs.core.Response com.test.Resources.AccountResource.addProfilePicture(java.io.InputStream,org.glassfish.jersey.media.multipart.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.test.Resources.AccountResource, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@1efcbc1f]}, definitionMethod=public javax.ws.rs.core.Response com.test.Resources.AccountResource.addProfilePicture(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), parameters=[Parameter [type=class java.io.InputStream, source=profilePicture, defaultValue=null], Parameter [type=class org.glassfish.jersey.media.multipart.FormDataContentDisposition, source=profilePicture, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']. Please see server.log for more details.
这是导致问题的代码:
@POST
@Path("addProfilePicture")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response addProfilePicture(@FormDataParam("profilePicture") InputStream pic,
@FormDataParam("profilePicture") FormDataContentDisposition formDataContentDisposition){
return Response.ok().build();
}
我的web.xml
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.test</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
根据类似的答案,我应该添加maven依赖并注册MultiPartFeature
。
如你所见,我都做了。
@ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
HashSet<Class<?>> classes = new HashSet<>();
classes.add(MultiPartFeature.class);
System.out.println("added multipart feature");
classes.add(AccountResource.class);
return classes;
}
}
这是我的 Maven 依赖项:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
</dependencies>
我已经尝试将 scope
更改为 provided
并使用 ResourceConfig
而不是 Application
。
事情是这样的。您有两种不同的应用程序配置:web.xml 和 ApplicationConfig
class。这些是完全独立的配置,它们本身都是有效的。 ApplicationConfig
class 是注册 MultiPartFeature
的那个,但似乎正在使用的配置是 web.xml。我从未真正测试过当您有两个不同的应用程序配置时会发生什么,但似乎您的 web.xml 优先。在您的 web.xml 中,您没有配置 MultiPartFeature
.
如果您只想使用 web.xml
,那么您可以查看
但是您可以只删除整个 web.xml。这将导致 ApplicationConfig
踢它。但请注意两个区别:ApplicationConfig
中的 @ApplicationPath
与 web.xml 中的 url-mapping
一样。因此,如果您删除 web.xml,那么基本路径将只是 /
(或什么都没有),而不是像 web.xml
/webapi
如果您决定删除 web.xml,我建议您使用 ResourceConfig
而不是 Application
。您可以从