找不到多部分功能的注入源

时间:2018-07-29 21:55:37

标签: maven jersey glassfish jersey-2.0 multipart

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

  

[[FATAL]找不到类型为public javax.ws.rs.core.Response com.test.Resources.AccountResource.addProfilePicture(java.io.InputStream,org.glassfish.jersey.media的参数的注入源。 ; multipart.FormDataContentDisposition)位于索引0。来源=“ 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]},defineMethod = public javax.ws.rs.core.Response com.test.Resources.AccountResource.addProfilePicture(java.io。 InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition),参数= [参数[type = class java.io.InputStream,source = profilePicture,defaultValue = null],参数[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

1 个答案:

答案 0 :(得分:1)

这就是问题。您有两种不同的应用程序配置:web.xml和ApplicationConfig类。这些是完全分开的配置,它们本身都是有效的。 ApplicationConfig类是注册MultiPartFeature的类,但似乎正在使用的配置是web.xml。我从来没有真正测试过当您使用两种不同的应用程序配置时会发生什么,但是似乎您的web.xml处于优先地位。并且在您的web.xml中,您没有配置MultiPartFeature

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

不过,您可以删除整个web.xml。这将导致ApplicationConfig对其进行踢。但是请注意两个区别:@ApplicationPath上的ApplicationConfig的行为类似于web.xml中的url-mapping。因此,如果删除web.xml,则基本路径将仅为/(或什么都不是),而不是像web.xml中的/webapi

如果您决定删除web.xml,建议您使用ResourceConfig而不是Application。您可以从What exactly is the ResourceConfig class in Jersey 2?

的这篇博文中获得有关此类的一些很好的信息以及不同的配置可能性