【问题标题】:How can I enable MultiPartFeature?如何启用 MultiPartFeature?
【发布时间】:2015-06-14 13:41:22
【问题描述】:

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

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

如何在不修改类的情况下启用org.glassfish.jersey.media.multipart.MultiPartFeature?还是不需要注册所有资源类/包?

【问题讨论】:

标签: jersey jax-rs multipartform-data jersey-2.0 multipart


【解决方案1】:

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

但无论如何,我会尝试以“最便携”的方式回答这个问题。您可以做的是设置一个属性,就像在 web.xml 中一样。要设置任意属性,您可以覆盖

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

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

@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;
}

这将为您的资源和提供者维护类路径扫描。仅当您覆盖 getClasses()getSingletons()(并返回非空集)时才会禁用扫描,但 getProperties() 很好。

另一种选择:

创建一个Feature 来包装那个 功能,并让该功能被发现,如seen here

就个人而言,我会...

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

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

【讨论】:

  • 太棒了!!!我实际上使用了packages(...).register(...)。然后,突然,jackson-provider 失败了。覆盖getProperties() 解决了我的问题。太棒了!!!
  • 我猜你使用的是this Jackson provider,它不会自动注册。并且类路径扫描拾取它的@Provider 注释。由于ResourceConfig 不进行类路径扫描(而是包扫描),您可以将包添加到packages(),如packages("your.packages,com.fasterxml.jackson.jaxrs.json")。这会加载 Jackson ExceptionMapper 以及读取器和写入器。
  • 另外,您可以使用this dependency,它实际上将先前的依赖项“包装”在“自动可覆盖”功能(v 2.9+)中,因此您不需要显式注册到包扫描它。 2.8 版- jusrt register(JacksonFeature.class);
  • 我之前评论的依赖是 jersey-media-json-jackson。 Here 是新链接。
【解决方案2】:

对我来说,工作如下:

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

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

这是 ApplicationConfig 类

@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;
    }
}

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2016-04-09
    • 2013-03-21
    • 2019-03-07
    • 2011-06-10
    • 2014-01-19
    相关资源
    最近更新 更多