当前位置: 首页 > 知识库问答 >
问题:

以编程方式配置Jersey应用程序

柳弘方
2023-03-14

我正在尝试使用我自己的应用程序实现或扩展的ResourceConfig或PackageResourceConfig来配置我的Jersey应用程序。因此,我的第一次尝试是将现有的web.xml(实际上,由于开发的库性质,我使用的是web-fragment.xml)配置移植到MyApplication实现。

<servlet>
    <servlet-name>rest</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>my.pkg.resources;org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>my.pkg.Filter1;my.pkg.Filter2</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>rest</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>my.pkg.MyApplication</servlet-name> <!-- implementation follows -->
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>my.pkg.MyApplication</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
// [...]

public class MyApplication extends PackagesResourceConfig {
private static final Logger logger = Logger.getLogger(MyApplication.class);

@Context
ServletConfig config

public MyApplication() {

    super("my.pkg.resources;org.codehaus.jackson.jaxrs");

    super.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);

    // filters not set
}

@PostConstruct 
public void readInitParams() {

    // read init params from ServletConfig

    // config.getInitParameterNames();
    // ...
}

}

当我使用第二个版本时,我会收到以下信息

mag 27, 2013 12:08:03 PM com.sun.jersey.api.core.PackagesResourceConfig init
INFO: Scanning for root resource and provider classes in the packages:
  aero.aice.jerico.rs;org.codehaus.jackson.jaxrs;
mag 27, 2013 12:08:03 PM com.sun.jersey.server.impl.application.DeferredResourceConfig$ApplicationHolder <init>
INFO: Instantiated the Application class my.package.MyApplication. The following root resource and provider classes are registered: [class com.sun.jersey.server.impl.application.WebApplicationImpl$1WadlContextResolver, class org.codehaus.jackson.jaxrs.JsonParseExceptionMapper, class org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider, class org.codehaus.jackson.jaxrs.JsonMappingExceptionMapper, class aero.aice.jerico.rs.service.OperationService, class aero.aice.jerico.rs.service.CrudService, class org.codehaus.jackson.jaxrs.JacksonJsonProvider]
mag 27, 2013 12:08:03 PM com.sun.jersey.core.spi.component.ProviderFactory __getComponentProvider
SEVERE: The provider class, class com.sun.jersey.server.impl.application.WebApplicationImpl$1WadlContextResolver, could not be instantiated. Processing will continue but the class will not be utilized
java.lang.InstantiationException: com.sun.jersey.server.impl.application.WebApplicationImpl$1WadlContextResolver

mag 27, 2013 12:08:04 PM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
  SEVERE: The class com.sun.jersey.server.impl.application.WebApplicationImpl$1WadlContextResolver is a not a public class and cannot be instantiated.
  SEVERE: The inner class com.sun.jersey.server.impl.application.WebApplicationImpl$1WadlContextResolver is not a static inner class and cannot be instantiated.

正如您所看到的,com.sun.jersey.server.impl.application.WebApplicationImpl$1WADLContextResolver是第一个注册的类,但由于它不是公共的,也不是静态的内部类,所以它是不可实例化的。我发现关于这个过程的文档很少,特别是关于如何在初始化期间设置特性和属性的文档。我使用的是Jersey的最新版本(1.17.1),但也用1.9进行了测试。是否也可以通过编程设置应用程序路径?我在文档中看到过@ApplicationPath,但它对我的目的并不有用,因为我需要在运行时设置它。我知道这些是更多的问题,但我认为它们都有相同的根源。谁能给我指出正确的方向吗?

共有1个答案

谢豪
2023-03-14

确保在扫描资源类的路径上没有jersey库。

只能在部署期间设置的基URI。使用war名称或@applicationpath。您可以使用web.xml中的servlet-mapping元素重写它。

 类似资料:
  • 什么是最简单的方法,以获得Spring引导好,但不试图自动配置所有的东西?例如,要只使用我们已经配置的属性(一些通过Consul+Spring Cloud加载)运行flyway,我希望可以做一些类似的事情: 并且让main方法只调用 这样做的问题是,它会拾取所有的组件扫描/其他依赖项的长列表。任何具体配置依赖项的方法(但仍然获得框架的nicities)

  • 我在logback.xml中定义了一个logback appender,它是一个DB appender,但是我想知道是否有任何方法可以使用我自己定义为bean的连接池在java中配置appender。 我发现了类似的事情,但从来没有真正的答案。

  • 问题内容: 我在logback.xml中定义了一个logback附加程序,它是一个数据库附加程序,但是我很好奇是否有任何方法可以使用定义为bean的我自己的连接池在java中配置附加程序。 我发现类似的事情,但没有实际答案。 问题答案: 这是一个对我有用的简单示例(请注意,在此示例中我使用FileAppender)

  • 问题内容: 我试图仅通过使用和此参考来配置和设置Log4j2 。我使用的代码如下: 注意 它扩展了默认情况下已经配置的控制台 它尝试向根记录器添加滚动文件追加器 我得到以下异常: 如果我在上面的代码之后注释掉该代码,它可以工作,但似乎缺少配置滚动文件附加程序的内容。我应该怎么做才能解决这个问题? 问题答案: 在 log4j 2.x中, 您必须以这种方式指定日期格式 标记格式的开始 表示它是日期格式

  • Im使用Log4j2 2.6.2。在应用程序的开始,我调用以下代码 输出显示为 即默认布局正在使用中。我对默认值的编程重写不起作用。有谁能帮你修改代码吗?

  • 问题内容: 说我有两个JavaBeans 和。 如果创建一个Person对象的列表,我想编组成这样的东西: 可以使用这里描述的技术: 使用JAXB解组/编组List 通过使用和注释JaxbList,可以将其编组为上述XML。 但是,能够重用相同的类来封送对象列表也很好。实际上,我将有许多其他类型的bean。我可以这样: 但是,理想情况下,最好用类名的复数形式替换“列表”,用类名替换“ item”。