如何启用 MultiPartFeature?

How can I enable MultiPartFeature?

我的 JAX-RS 应用程序有一个扩展应用程序 class。

@ApplicationPath("/")
public class MyApplication extends Application {
    // empty; really empty
}

如何在不修改 class 的情况下启用 org.glassfish.jersey.media.multipart.MultiPartFeature?或者无需注册所有资源 classes/packages?

不确定为什么不直接使用 ResourceConfig 而不是 Application class。我能想到的唯一原因是可移植性,但使用 Jersey 特定的多部分功能已经破坏了可移植性。

但无论如何,我会尝试以 "most portable" 的方式回答这个问题。你可以做的是设置一个 属性,就像你在 web.xml 中所做的那样。要设置任意属性,您可以覆盖

@Override
public Map<String, Object> getProperties() {}

Application 子 class 中,并在那里设置属性。

@Override
public Map<String, Object> getProperties() {
    Map<String, Object> props = new HashMap<>();
    props.put("jersey.config.server.provider.classnames", 
            "org.glassfish.jersey.media.multipart.MultiPartFeature");
    return props;
}

这将为您的资源和供应商维护class路径扫描。仅当您覆盖 getClasses()getSingletons()(和 return 非空集)时才会禁用扫描,但 getProperties() 没问题。

另一个选项:

创建一个Feature来包装那个特征,并让这个特征被发现,如

就个人而言,我会...

只需使用 ResourceConfig,因为您已经破坏了可移植性(还有一点破坏 :-)

@ApplicationPath("/")
public class AppConfig extends ResourceConfig {
    public AppConfig() {
        packages("packages.to.scan");
        register(MultiPartFeature.class);
    }
}

我的工作如下:

        final ResourceConfig resourceConfig = new ResourceConfig(ApplicationConfig.class);
        resourceConfig.packages("com.econorma.rest");
        resourceConfig.register(MultiPartFeature.class);

        ServletHolder jerseyServlet  = new ServletHolder(new ServletContainer(resourceConfig));

这是ApplicationConfig class

@ApplicationPath("/")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        final Set<Class<?>> resources = new HashSet<Class<?>>();
        resources.add(MultiPartFeature.class);
        resources.add(EntryPoint.class);
        return resources;
    }

    @Override
    public Map<String, Object> getProperties() {
        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put("jersey.config.server.provider.packages", "com.econorma.rest");
        return properties;
    }
}