为什么"java.lang.IllegalStateException:资源配置在此上下文中不可修改".出现部署Jersey应用程序?

 彬彬521521 发布于 2023-02-09 12:49

我创建了一个在本地实现REST服务的应用程序:

Eclipse Indigo Jersey 2.4 Tomcat 7.0.47

使用Eclipse在本地运行时,服务工作正常,但在部署我的WAR文件时,尝试对其中一个服务URL执行GET时会出现以下异常:

HTTP Status 500 - Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception

type Exception report

message Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Servlet.init() for servlet com.app.rest.MyResourceConfig threw exception
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    java.lang.Thread.run(Thread.java:662)

root cause

java.lang.IllegalStateException: The resource configuration is not modifiable in this context.
    org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:270)
    org.glassfish.jersey.server.ResourceConfig$ImmutableState.register(ResourceConfig.java:218)
    org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:448)
    org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:300)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
    org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
    javax.servlet.GenericServlet.init(GenericServlet.java:160)
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    java.lang.Thread.run(Thread.java:662)

我一直无法找到根本原因,我唯一的怀疑是它可能是缺少运行依赖项或Eclipse中的某些其他配置,这些配置与我自己的本地Tomcat服务器环境和远程服务器上的Tomcat不同.

我在资源配置类的代码是:

package com.app.rest;

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;

import com.app.rest.services.RunDetailsService;
import com.app.rest.services.RunHistoryService;
import com.app.rest.services.RunPollService;
import com.app.rest.services.RunTestService;


@ApplicationPath("api")
public class MyResourceConfig extends ResourceConfig {

    public MyResourceConfig() {
        register(RunHistoryService.class).
        register(RunTestService.class).
        register(RunDetailsService.class).
        register(RunPollService.class);     
    }   
}

您认为可能的原因是什么?

4 个回答
  • 我管理导致同样的错误,这是由于两种情况1)的路径的资源的范围内WS必须不从"/ XYZ"开始的定义仅仅是"XYZ"到ResourceConfig @ApplicationPath("/")

    2)时,也会发生由于任何API(罐)中的.war项目或Tomcat/lib中的依赖

    3)当在以下日志中显示资源路径中存在歧义(重复相同名称)时也会发生这种情况:"警告:资源模型具有HTTP方法GET的模糊(子)资源方法,并且输入mime类型已定义@Consumes和@Produces注释Java方法public javax.ws.rs.core.Response"

    Netbeans 8.1,Apache Tomcat 8.0.12,JAX-RS 2.0(球衣2.12)

    2023-02-09 12:51 回答
  • 一个可能的原因是您有两个或更多适用于该URL调用的映射.

    例如:

    @Path( "/ {myParam}")

    而在其他地方:

    @Path( "/ {differentParam}")

    现在泽西岛无法告诉实际应该调用哪种方法并给出了这个错误.

    2023-02-09 12:51 回答
  • 对于遇到这个问题的人来说,发布的时间非常晚.我有完全相同的问题 - 在eclipse中本地工作,但是当我尝试在Eclipse之外部署时,它崩溃并在问题中使用相同的堆栈跟踪进行刻录.问题是由于我们正在部署的war文件命名不正确而导致我们的webapps重复部署.

    当autoDeploy设置为true时,tomcat需要与上下文路径相关的.war文件的非常特定的命名约定.例如,上下文路径"/ foo/bar"必须具有名为"foo#bar.war"的相应.war文件.此外,映射到"/"或""的上下文路径需要一个名为ROOT.war的war文件.

    完整的命名规则可以在这里找到:http://tomcat.apache.org/tomcat-7.0-doc/config/context.html#Naming

    修复war文件的名称解决了这个问题.

    我还要注意到,最终,eclipse也为这个问题窒息了.偶尔,清理项目并尝试重新运行将解决问题,但不是每次都有,而且我不确定为什么要修复它.我仍在努力寻找完整的解决方案.解决eclipse的问题有点难,因为(据我所知)我无法指定eclipse发布项目的目录的名称.例如,名为"foo"的eclipse中的上下文根目录为"bar/baz"的项目将发布在名为"foo"而不是"bar#baz"的目录中,tomcat/Jersey似乎不喜欢这样.

    我希望这有助于拯救某人12个小时,我和我的团队在演示前一晚调试此问题:)

    2023-02-09 12:51 回答
  • 就我而言,我有一个用于文件上传的Jersey POST资源.资源指定了参数: @FormDataParam("file") InputStream file

    并消耗了MediaType.MULTIPART_FORM_DATA.

    要解决此问题,我必须在web.xml文件中将以下内容添加到Jersey REST配置中:

    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
    

    2023-02-09 12:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有