无法使用本地Tomcat服务器上的Java REST-API连接到pgsql数据库。堆栈包含ExceptionInInitializerError和IllegalStateException

无法使用本地Tomcat服务器上的Java REST-API连接到pgsql数据库。堆栈包含ExceptionInInitializerError和IllegalStateException,java,rest,postgresql-9.4,illegalstateexception,tomcat8.5,Java,Rest,Postgresql 9.4,Illegalstateexception,Tomcat8.5,我正在开发一个REST-API,目前正试图解决一个问题。问题是,当我在chrome中访问我的网页时,REST-API无法连接到pgsql数据库。为了说明这个问题,我将发布一个精简版本的堆栈,并给出一些解释,描述所涉及的Java类和XML的起源和功能。之后,我将展示相关XML文件和java类的一些代码。我将期待您在我的第一篇文章中给出答案和反馈 更新:在文章的最后,我将透露我在寻找答案方面的主要进展 到目前为止,我正在使用以下工具: 月食EE(此刻的氧气II) ApacheTomcat 8.5.

我正在开发一个REST-API,目前正试图解决一个问题。问题是,当我在chrome中访问我的网页时,REST-API无法连接到pgsql数据库。为了说明这个问题,我将发布一个精简版本的堆栈,并给出一些解释,描述所涉及的Java类和XML的起源和功能。之后,我将展示相关XML文件和java类的一些代码。我将期待您在我的第一篇文章中给出答案和反馈

更新:在文章的最后,我将透露我在寻找答案方面的主要进展

到目前为止,我正在使用以下工具:

  • 月食EE(此刻的氧气II)
  • ApacheTomcat 8.5.14
  • 马文
  • PG管理员4
堆栈从这条线开始,这可能意味着泽西遇到了一些困难

WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
我的堆栈继续使用java.lang.ExceptionInInitializerError,如下所示,它源自我的数据库连接代理

MultiException stack 1 of 2
java.lang.ExceptionInInitializerError
at nl.hu.v1wac.PostgresDAO.webservices.WorldResource.<init (WorldResource.java:25) 
Caused by: java.lang.RuntimeException: javax.naming.NameNotFoundException: Name [jdbc/PostgresDS] is not bound in this Context. Unable to find [jdbc].
at nl.hu.v1wac.PostgresDAO.jdbc.BaseDAO.<init>(BaseDAO.java:38)
at nl.hu.v1wac.PostgresDAO.jdbc.CountryDAO.<init>(CountryDAO.java:13)
at nl.hu.v1wac.PostgresDAO.model.WorldService.<init>(WorldService.java:9)
at nl.hu.v1wac.PostgresDAO.model.ServiceProvider.<clinit>(ServiceProvider.java:4)
... 61 more
下面我将展示我的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <display-name>MavenJersey</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>nl.hu.v1wac.PostgresDAO.webservices</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/restservices/*</url-pattern>
  </servlet-mapping>
</web-app>
最后,我将用我的WorldResource类来结束这篇文章。请注意,大多数代码被排除在外

public class WorldResource{
    private WorldService service = ServiceProvider.getWorldService();    
@GET
@RolesAllowed({"admin"})
@Path("/getAll")
@Produces(MediaType.APPLICATION_JSON)
public String getCountries() {
        JsonArrayBuilder jab;
        jab = Json.createArrayBuilder();
        for (Country c : service.getAllCountries()) {
            jab.add(makeCountryObj(c));
        }
        return jab.build().toString();
}
编辑:在@Alok Sinha发布context.xml丢失后,我添加了我已经存在的context.xml以提供一些额外的见解

<?xml version="1.0" encoding="UTF-8"?> 
<Context> <Resource name="jdbc/PostgresDS" 

url="jdbc:postgresql://localhost:5432/mydb" driverClassName="org.postgresql.Driver" 
auth="Container" 
type="javax.sql.DataSource" 
username="javaduser" 
password="javadude" 
/> 
<ResourceLink name="jdbc/PostgresDS" global="jdbc/PostgresDS" type="javax.sql.DataSource" 
/>
</Context>
更新2: 我试过另一种方法。我从一个初始的maven项目开始,并从那里构建我的应用程序。我摆脱了非法国家的例外。我已经完全按照Alok Sinha的描述实现了您的context.xml。所以,没有资源链接。我还将BaseDAO解压到只有Initialcontext和Datasource的程度。现在,我可以将应用程序部署为war文件,而无需basedao。如果我尝试使用BaseDAO部署它,由于tomcat日志中的以下错误,我无法运行:

org.apache.catalina.deploy.NamingResourcesImpl.cleanUp Failed to retrieve
JNDI naming context for container [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/holidayboardapp]] so no cleanup was performed for that container 
  javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].`

看起来您还没有在tomcat的JNDI中绑定数据源。您需要在context.xml中创建一个条目,如下所示-

<Resource name="jdbc/PostgresDS" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           username="javauser" password="javadude" driverClassName="org.postgresql.Driver"
           url="jdbc:postgresql:localhost..."/>

与我最初的问题不同,解决方案取决于我如何部署我的应用程序。起点。下面我将描述我在这一过程中学到的两个起点

一个起点是使用EclipseEE部署应用程序,然后Eclipse将它部署在Tomcat根文件夹上的wtpwebapps上。Eclipse在wtpwebapps文件夹中部署应用程序。然后,每个应用程序将作为server.xml
的下属引用。这个答案也被提到


另一个起点是直接在tomcat webapps文件夹上部署我的应用程序,或者使用tomcat管理器,我将在maven构建中包含context.xml,就像Alok Sinha正确地告诉我的那样。Tomcat随后将为我进行部署


根据我个人的经验,你必须决定你喜欢哪一个起点。如果您想使用Eclipse来执行此操作,则不能使用tomcat manager取消部署或重新部署应用程序,因为应用程序的上下文将硬编码在server.xml中。如果仍要这样做,则必须从server.xml中手动删除应用程序中的上下文

谢谢你的回答。但我已经添加了一个上下文文件。我将把它添加到我的问题中
您不能在context.xml中同时使用相同jndi名称的Resource和ResourceLink,如果您想使用ResourceLink,请在GlobalNamingResources下定义Resource。实际上,我想同时使用Resource和ResourceLink。下面我描述了我的三种尝试方法,但似乎都没有成功,不幸的是,包括你的。我第一次尝试将资源添加到下面,如您所述。在第二次尝试中,我删除了resourcelink。在第三次尝试中,我遗漏了资源。我也读过tomcat的这本手册。我建议您参考每web应用程序上下文XML方法。资料来源:我期待你的回复,我会让你了解最新情况。忘了提一个小细节。这三种方法的结果都是一样的。我把我的最新反应作为更新放在了我的任务中。名称:UPDATE2。我期待你的答复。
  <resource-ref>
    <description>PostgreSQL Datasource example</description>
    <res-ref-name>jdbc/PostgresDS</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
Cannot create JDBC driver of class '' for connect URL 'null'
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getDriver(Unknown Source)
at nl.hu.v1wac.PostgresDAO.jdbc.BaseDAO.getConnection(BaseDAO.java:47)
at nl.hu.v1wac.PostgresDAO.webservices.WorldResource.getCountries(WorldResource.java:34)
org.apache.catalina.deploy.NamingResourcesImpl.cleanUp Failed to retrieve
JNDI naming context for container [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/holidayboardapp]] so no cleanup was performed for that container 
  javax.naming.NameNotFoundException: Name [comp/env] is not bound in this Context. Unable to find [comp].`
<Resource name="jdbc/PostgresDS" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           username="javauser" password="javadude" driverClassName="org.postgresql.Driver"
           url="jdbc:postgresql:localhost..."/>
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">