Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 弹簧注入不适用于FF4J web控制台_Java_Spring_Ff4j - Fatal编程技术网

Java 弹簧注入不适用于FF4J web控制台

Java 弹簧注入不适用于FF4J web控制台,java,spring,ff4j,Java,Spring,Ff4j,我正在尝试让FF4j()web控制台工作。根据网站上的文档,我使用以下配置: ff4j控制台 org.ff4j.web.embedded.ConsoleServlet ff4jProvider .ConsoleFF4jProvider 1. ff4j控制台 /ff4j控制台 index.jsp 我对FF4JProvider的实现是: import org.ff4j.FF4j; import org.ff4j.web.api.FF4JProvider; import org.springfra

我正在尝试让FF4j()web控制台工作。根据网站上的文档,我使用以下配置:


ff4j控制台
org.ff4j.web.embedded.ConsoleServlet
ff4jProvider
.ConsoleFF4jProvider
1.
ff4j控制台
/ff4j控制台
index.jsp
我对FF4JProvider的实现是:

import org.ff4j.FF4j;
import org.ff4j.web.api.FF4JProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * Created by itaykl on 17/06/2015.
 */
@Component
public class ConsoleFF4jProvider implements FF4JProvider{

    @Autowired
    private FF4j ff4j;

    public ConsoleFF4jProvider() {
    }

    @Override
    public FF4j getFF4j() {
        return ff4j;
    }
}
我的问题是,无论我做什么,我都无法让
ff4j
的自动布线工作。每当
ConsoleServlet
到达
getFF4J()
的方法调用时,
ff4j
类成员为
null

我曾尝试将其他几个servlet与FF4J控制台一起使用,并尝试以几种方式定义
FF4J
bean

目前定义为:


但似乎什么都不管用


如果有人找到了这个问题的解决方案并能与大家分享,我将不胜感激。

正如我在评论中所说,当您试图在
ConsoleFF4jProvider
中访问bean时,
FF4j
的构造函数还没有被调用。这是因为Spring首先加载
ConsoleFF4jProvider
,而不是
web.xml
中定义的bean。要解决此问题,您可以删除:

@Autowired
private FF4j ff4j;
并修改
getFF4j()
函数,如下所示:

@Override
public FF4j getFF4j() {
    final AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.register(FF4j.class); 
    context.refresh();

    FF4j ff4j= context.getBean(FF4j.class);
    return ff4j;
}
或者也可以在构造函数中初始化ff4j

编辑: 否则,您可以添加

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
ConsoleFF4jProvider的构造函数


希望这能解决您的问题。

正如我在评论中所说,当您试图在
ConsoleFF4jProvider
中访问bean时,
FF4j
的构造函数还没有被调用。这是因为Spring首先加载
ConsoleFF4jProvider
,而不是
web.xml
中定义的bean。要解决此问题,您可以删除:

@Autowired
private FF4j ff4j;
并修改
getFF4j()
函数,如下所示:

@Override
public FF4j getFF4j() {
    final AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
    context.register(FF4j.class); 
    context.refresh();

    FF4j ff4j= context.getBean(FF4j.class);
    return ff4j;
}
或者也可以在构造函数中初始化ff4j

编辑: 否则,您可以添加

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
ConsoleFF4jProvider的构造函数


希望这能解决您的问题。

Spring 4注入与@Configuration class和@Autowired一起工作

package foo.bar;

import org.ff4j.FF4j;
import org.ff4j.web.api.FF4JProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;

public class ConsoleFF4jProvider implements FF4JProvider {

    @Autowired
    private FF4j ff4j;

    /**
     * Inject the appropriate Spring bean FF4j declared into
     * {@link ApplicationConfig}. Property {@code ff4j} marked with @Autowired
     * annotation will work.
     */
    public ConsoleFF4jProvider() {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }

    @Override
    public FF4j getFF4j() {
        return ff4j;
    }
}
问题是servlet是由Jetty(您的servlet容器)初始化的,这就是为什么ConsoleEff4JProvider不知道Spring上下文

在这个例子中,您仍然可以使用带有@Autowired的弹簧注入机制

您需要:

  • 在web.xml中添加Spring侦听器
  • 创建一个Java类来处理bean FF4j
  • 在ConsoleEff4JProvider中注入Spring上下文
  • web.xml:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    
        <display-name>HelloWorld ff4j app</display-name>
    
         <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <context-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </context-param>
    
        <!-- Configuration using @Configuration classes -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>foo.bar.ApplicationConfig</param-value>
        </context-param>
    
        <servlet>
            <servlet-name>ff4j-console</servlet-name>
            <servlet-class>org.ff4j.web.embedded.ConsoleServlet</servlet-class>
            <init-param>
                <param-name>ff4jProvider</param-name>
                <param-value>foo.bar.ConsoleFF4jProvider</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>ff4j-console</servlet-name>
            <url-pattern>/ff4j-console</url-pattern>
        </servlet-mapping>
    
        <welcome-file-list>
            <welcome-file>index.jsp </welcome-file>
        </welcome-file-list>
    
    </web-app>
    
    ConsoleFF4jProvider.java已更新

    package foo.bar;
    
    import org.ff4j.FF4j;
    import org.ff4j.web.api.FF4JProvider;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.context.support.SpringBeanAutowiringSupport;
    
    public class ConsoleFF4jProvider implements FF4JProvider {
    
        @Autowired
        private FF4j ff4j;
    
        /**
         * Inject the appropriate Spring bean FF4j declared into
         * {@link ApplicationConfig}. Property {@code ff4j} marked with @Autowired
         * annotation will work.
         */
        public ConsoleFF4jProvider() {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        }
    
        @Override
        public FF4j getFF4j() {
            return ff4j;
        }
    }
    

    Spring 4注入与@Configuration class和@Autowired一起工作

    package foo.bar;
    
    import org.ff4j.FF4j;
    import org.ff4j.web.api.FF4JProvider;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.context.support.SpringBeanAutowiringSupport;
    
    public class ConsoleFF4jProvider implements FF4JProvider {
    
        @Autowired
        private FF4j ff4j;
    
        /**
         * Inject the appropriate Spring bean FF4j declared into
         * {@link ApplicationConfig}. Property {@code ff4j} marked with @Autowired
         * annotation will work.
         */
        public ConsoleFF4jProvider() {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        }
    
        @Override
        public FF4j getFF4j() {
            return ff4j;
        }
    }
    
    问题是servlet是由Jetty(您的servlet容器)初始化的,这就是为什么ConsoleEff4JProvider不知道Spring上下文

    在这个例子中,您仍然可以使用带有@Autowired的弹簧注入机制

    您需要:

  • 在web.xml中添加Spring侦听器
  • 创建一个Java类来处理bean FF4j
  • 在ConsoleEff4JProvider中注入Spring上下文
  • web.xml:

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    
        <display-name>HelloWorld ff4j app</display-name>
    
         <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <context-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </context-param>
    
        <!-- Configuration using @Configuration classes -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>foo.bar.ApplicationConfig</param-value>
        </context-param>
    
        <servlet>
            <servlet-name>ff4j-console</servlet-name>
            <servlet-class>org.ff4j.web.embedded.ConsoleServlet</servlet-class>
            <init-param>
                <param-name>ff4jProvider</param-name>
                <param-value>foo.bar.ConsoleFF4jProvider</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>ff4j-console</servlet-name>
            <url-pattern>/ff4j-console</url-pattern>
        </servlet-mapping>
    
        <welcome-file-list>
            <welcome-file>index.jsp </welcome-file>
        </welcome-file-list>
    
    </web-app>
    
    ConsoleFF4jProvider.java已更新

    package foo.bar;
    
    import org.ff4j.FF4j;
    import org.ff4j.web.api.FF4JProvider;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.context.support.SpringBeanAutowiringSupport;
    
    public class ConsoleFF4jProvider implements FF4JProvider {
    
        @Autowired
        private FF4j ff4j;
    
        /**
         * Inject the appropriate Spring bean FF4j declared into
         * {@link ApplicationConfig}. Property {@code ff4j} marked with @Autowired
         * annotation will work.
         */
        public ConsoleFF4jProvider() {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        }
    
        @Override
        public FF4j getFF4j() {
            return ff4j;
        }
    }
    

    我对DI也有类似的问题。原因是我的
    @组件
    类是在
    @Autowired
    类之前初始化的。还可以添加
    ConsoleFF4jProvider
    类的bean定义吗?它是以与
    相同的速度制作的吗?没有bean定义,它只是注释。您的
    ConsoleFF4jProvider
    FF4j
    的构造函数之前初始化。我会在几分钟后添加更多信息,我在DI方面也遇到了类似的问题。原因是我的
    @组件
    类是在
    @Autowired
    类之前初始化的。还可以添加
    ConsoleFF4jProvider
    类的bean定义吗?它是以与
    相同的速度制作的吗?没有bean定义,它只是注释。您的
    ConsoleFF4jProvider
    FF4j
    的构造函数之前初始化。我将在几分钟后添加更多信息。这可以实例化FF4j,但是当我尝试更改bean配置时,例如,它不起作用。似乎每次都只是使用默认构造函数实例化FF4j基本上这与只执行FF4j FF4j=new FF4j()相同;我做了更多的调查,发现可以添加
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(这个)
    ConsoleFF4jProvider的构造函数
    。然后您可以将
    FF4j
    保留为
    Autowired
    。它成功了!!多谢了,伙计,我已经坚持了好几天了。将您的最后一条评论作为答案发布,以便我可以检查它是否正确。不客气,我还尝试了
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(这个)
    ConsoleFF4jProvider的构造函数
    。然后您可以将
    FF4j
    保留为
    Autowired
    。它成功了!!多谢了,伙计,我已经坚持了好几天了。将您的最后一条评论作为答案发布,以便我可以检查它是否正确。不客气,我还尝试了
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)这是第一次。