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

可以从罐子里找到进口的春豆,但不能从战争中找到

许毅
2023-03-14

FrameworkBaseImpl有一个main,它调用Jetty,传递FrameworkRestService WAR。

我试图让Spring在FrameworkBaseImpl的FrameworkMain类的(唯一)实例中注入一个RestService实例作为字段成员。我的Spring指向FrameworkRestService项目中的FrameworkRestService类来实现restService bean。

这里有一个问题:尽管Spring似乎在包含bean的WAR中找到了导入的framework_rest_service.context文件,但它在注入bean时失败了(找不到名为restService的bean)。但是如果我将FrameworkRestService转换为JAR,它就神奇地成功了!我被困了2天!请救命!

<project xmlns="http://maven.apache.org/POM/4.0.0"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>framework.base</artifactId>
  <packaging>jar</packaging>
  <name>framework.base</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <parent>
    <groupId>controlapps</groupId>
    <artifactId>controlapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../controlapp/pom.xml</relativePath>
  </parent>
</project>
package com.company.controlapps.framework.base;

public class RestService {
    public FrameworkMain frameworkMain;

    /* Setters for Spring */
    public void setFrameworkMain(FrameworkMain frameworkMain) 
            {this.frameworkMain = frameworkMain;}
}

FrameworkBase FrameworkMain:

package com.company.controlapps.framework.base;

public interface FrameworkMain {    
...
}

FrameworkBaseImpl pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>framework.base.impl</artifactId>
  <packaging>jar</packaging>
  <name>framework.base.impl</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <parent>
    <groupId>controlapps</groupId>
     <artifactId>controlapp</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <relativePath>../controlapp/pom.xml</relativePath>
  </parent>

  <dependencies>
      <dependency>
    <groupId>controlapps</groupId>
    <artifactId>framework.base</artifactId>
     <version>0.0.1-SNAPSHOT</version>
  </dependency>
  <dependency>
     <groupId>controlapps</groupId>
     <artifactId>framework.restservice</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <scope>runtime</scope>
     <type>war</type>       
   </dependency>
  </dependencies>
</project>

FrameworkBaseImpl

package com.company.controlapps.framework.base.impl;

public class FrameworkMainImpl implements FrameworkMain {
    ....
    protected RestService restService;
    public void setRestService(RestService restService) 
        {this.restService = restService;}
}

public static void main(String[] args) {        
    context = new ClassPathXmlApplicationContext(SPRING_CONTEXT_FILENAME);
    FrameworkMainImpl frameworkMain = (FrameworkMainImpl) context.getBean("frameworkMain");
        ...
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <import resource="classpath*:framework_restservice_context.xml"/>

    <bean id="frameworkMain" class="com.company.controlapps.framework.base.impl.FrameworkMainImpl" >
    <property name="restService" ref="restService" />
    </bean> 
</beans>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <artifactId>framework.restservice</artifactId>
  <packaging>war</packaging>
  <name>framework.restservice</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <jersey.version>1.12</jersey.version>
  </properties>

  <parent>
    <groupId>controlapps</groupId>
    <artifactId>controlapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../controlapp/pom.xml</relativePath>
  </parent>

  <dependencies>
      <dependency>
      <groupId>controlapps</groupId>
      <artifactId>framework.base</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      </dependency>
      <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-server</artifactId>
      <version>${jersey.version}</version>
      </dependency>
      <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-json</artifactId>
      <version>${jersey.version}</version>
      </dependency>
      <dependency>
       <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-server-linking</artifactId>
       <version>${jersey.version}</version>
      </dependency>
      <dependency>
    <groupId>com.sun.jersey.contribs</groupId>
    <artifactId>jersey-spring</artifactId>
    <version>${jersey.version}</version>
</dependency>
<dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.5.4</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
  </dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="restService" class="com.radware.controlapps.framework.restservice.FrameworkRestService">
    <property name="frameworkMain" ref="frameworkMain" />
   </bean>
</beans>
package com.company.controlapps.framework.restservice;

@Path("myresource")
public class FrameworkRestService extends RestService {
    ... 
    @Context
    UriInfo uriInfo;
    @Context
    Request request;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public MyResource getMyResource() {
    ...
    frameworkMain.doSomething();
    ....
}

共有1个答案

甄鹏云
2023-03-14

这不是类加载器的问题。我让WAR和JAR使用相同的类加载器(JAR的)。有人评论说,我不应该试图把战争联系起来,在那里寻找豆子。

因此,我没有试图解决这个问题,而是通过取消JAR和WAR之间的Spring依赖关系来绕过它。在WAR中,我仍然需要对JAR中实例化的FrameworkMain单例的引用。

我对此进行了如下“黑客攻击”:我添加了一个名为Holder的类,并使用公共静态方法get和set FrameworkMain实例singleton。我叫从战争中得来,叫从罐子中得来。我无法将其添加到FrameworkMain,它实际上是FrameworkBase jar中的一个接口(由FrameworkBaseImpl jar中的FrameworkMainImpl实现)。

 类似资料:
  • 有什么不同?我可以在联机主机上部署吗?

  • 我以前和legacy Spring合作过。我们通过xml配置定义了bean,并手动连接它们。我的团队最终做出了一致的努力来更新注释,并使用Spring Boot而不是Spring MVC的‘传统’方法。

  • 我是Spring boot和tomcat的初学者,我发现了这个问题: 在tomcat服务器上部署Spring Bootwar文件时,如果要添加静态索引,就会出现问题。html与它并肩作战。 为了使它能够部署为war,我在我的应用程序类中添加了以下内容: 现在应用程序工作,但index.html(它位于src/main/资源下)将不显示(IM获得Whitelabel错误页与有一个意外的错误(type

  • 问题内容: openCV核心扩展的Java jar库在哪里,以便可以将其导入Java代码中? 我找不到他们教过如何正确设置所有内容的地方。我正在使用并且已经安装了openCV。我想在eclipse IDE中使用它,而eclipse需要一个jar文件,以便可以使用openCV函数。我看到下面的链接已经使用了 如何获取这些.jar文件? 问题答案: 您可以在此链接中找到用于Linux的jar,它们可以

  • 没有图像很难描述: 编辑:(我不能发布一个图像,直到我有更多的声誉)。 jar存在于外部库中,包包含类('org.roblectric.AndroidManifest')。导入语句在“robolectric”之前是灰色的,但在“AndroidManifest”上是红色的。当我点击包(robolectric)时,它会将我带到正确的包,其中显然包含该类。 这是应用程序中唯一的机器人库,因此它不是在使用

  • 遵循文档中的示例: https://symfony.com/doc/current/page_creation.html 我遇到这个错误消息: 自动加载程序期望类"App\Controller\LuckyController"定义在文件"/var/www/my-project/供应商/作曲家/.../... /src/Controller/LuckyController.php”。找到该文件,但类