【问题标题】:No injection source found for Multipart feature未找到 Multipart 功能的注入源
【发布时间】:2018-07-29 21:55:37
【问题描述】:

当我尝试将我的 maven 项目部署到 Glassfish 5 时,我收到以下错误:

[[致命] 未找到公共 javax.ws.rs.core.Response com.test.Resources.AccountResource.addProfilePicture(java.io.InputStream,org.glassfish.jersey.media. multipart.FormDataContentDisposition) 在索引 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=[]}']。有关详细信息,请参阅 server.log。

这是导致问题的代码:

@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。

【问题讨论】:

    标签: maven jersey glassfish jersey-2.0 multipart


    【解决方案1】:

    所以事情就是这样。您有两种不同的应用程序配置:web.xml 和ApplicationConfig 类。这些是完全独立的配置,它们本身都是有效的。 ApplicationConfig 类是注册 MultiPartFeature 的类,但似乎正在使用的配置是 web.xml。我从未真正测试过当您有两种不同的应用程序配置时会发生什么,但似乎您的 web.xml 优先。在您的 web.xml 中,您没有配置 MultiPartFeature。

    如果您只想使用web.xml,那么您可以查看this answer 了解如何配置它。

    但是,您可以只删除整个 web.xml。这将导致ApplicationConfig 踢它。但请注意两个不同之处:ApplicationConfig 上的 @ApplicationPath 与 web.xml 中的 url-mapping 类似。因此,如果您删除 web.xml,那么基本路径将只是 /(或什么都没有),而不是像您在 web.xml 中那样的 /webapi

    如果你决定删除 web.xml,我建议你使用ResourceConfig 而不是Application。你可以从What exactly is the ResourceConfig class in Jersey 2?的这篇文章中获得关于这个类和不同配置可能性的一些很好的信息

    【讨论】:

    • 我删除了 web.xml 并且它可以工作。谢谢保罗,我真的很感谢你的帮助:)
    • @JakobHerk 不用担心,很高兴为您提供帮助。
    • 其他一些建议:1) 你所有的 Jersey 和 (Servlet) 依赖项都应该在提供的范围内,因为 Glassfish 已经有了它们。 2) 您使用的是非常旧的 Servlet API 版本,应该升级它。我认为应该是this one。但它仍然应该是一个提供的范围
    猜你喜欢
    • 2021-06-30
    • 2015-09-18
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多