标签: autowired

@Autowired对象在一个类中获取空值,而在另一个类中成功连接

我正在使用Spring 3和Spring Security开发一个项目.我的问题是IoC容器.当我UserDetailsService为Spring Security-3 编写自己的实现时问题就出现了.我检查了其他问题,但仍无法解决问题.

问题的定义是:

我有两个单独的类(一个是UsersController.java扩展的@Controller,ProjectUserDetailsService哪个扩展@Service),它使用一个公共对象进行自动装配.但是当对象成功自动装入时UsersController,它就nullProjectUserDetailsService类中,尽管这个类(ProjectUserDetailsService)的对象已成功创建(我通过调试验证了这一点).

有什么建议如何解决这个问题?

这里是我的web.xml,project-servlet.xml而且project-security.xml文件和相关的类.

Web.xml`

<?xml version="1.0" encoding="UTF-8"?>
<!--
  - Tutorial web application
  -
  -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>Ecognitio with Spring Security</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
            /WEB-INF/ecognitio-servlet.xml
            /WEB-INF/ecognitio-security.xml
        </param-value>
  </context-param>
  <context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>tutorial.root</param-value>
  </context-param>
  <filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
  </listener> …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc autowired

16
推荐指数
1
解决办法
2万
查看次数

从单元测试中注入模拟Spring @Autowired依赖项的最佳方法是什么?

import org.springframework.beans.factory.annotation.Autowired;

class MyService {
  @Autowired private DependencyOne dependencyOne;
  @Autowired private DependencyTwo dependencyTwo;

  public void doSomething(){
    //Does something with dependencies
  }
}
Run Code Online (Sandbox Code Playgroud)

在测试这个类时,我基本上有四种注入模拟依赖项的方法:

  1. 在测试中使用Spring的ReflectionTestUtils来注入依赖项
  2. 向MyService添加构造函数
  3. 将setter方法添加到MyService
  4. 放宽对包受保护的依赖性可见性并直接设置字段

哪个最好,为什么?

---更新---

我想我应该更清楚一点 - 我只是谈论"单元"样式测试,而不是Spring"集成"样式测试,其中依赖关系可以使用Spring上下文连接.

java spring dependency-injection mocking autowired

16
推荐指数
1
解决办法
7224
查看次数

Spring Dependency Injection Autowiring Null

我能够使用RestTemplate并自动装配它.但是,我想将我的其余模板相关的代码部分移动到另一个类中,如下所示:

public class Bridge {

    private final String BASE_URL = "http://localhost:8080/u";

    @Autowired
    RestTemplate restTemplate;

    public void addW() {
       Map<String, String> x = new HashMap<String, String>();
       W c = restTemplate.getForObject(BASE_URL + "/device/yeni", W.class, x);
       System.out.println("Here!");
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个班级我称之为:

...
Bridge wb = new Bridge();
wb.addW();
...
Run Code Online (Sandbox Code Playgroud)

我是Spring和依赖注入术语的新手.我的restTemplate 变量为null并抛出异常.我该怎么做才能解决它(我不知道它与我使用 new关键字有关)?

java spring dependency-injection autowired

15
推荐指数
2
解决办法
3万
查看次数

spring boot autoconfiguration with jdbc template autowiring dataSource issue

我是Spring和J2EE的新手.我在使用带有Spring Boot自动配置的JDBC模板时遇到了麻烦.

我做的是我采用这里提供的RESTful Web服务的例子, 并决定扩展它以使用JDBC模板关系数据库访问.不幸的是,提供的另一个例子没有用,因为不考虑从xml beans文件提供dataSource的唯一困难.

我试图解决这个问题:

  1. 使用DAO Impl类作为Spring的不同实现的扩展.
  2. 添加到bean文件.
  3. 使用不同的DataSource类(例如DriverManagerDataSource).
  4. 试图在另一个类中自动装配一个简单的属性(比数据源更复杂的东西).
  5. 在开始时我刚刚编写了DAO类,但是后来我可能只有在实现了接口时才可以自动装配数据源,尝试它,没有帮助.

我尝试了在Stack或Google上找到的所有内容.大多数示例都严重过时或未得到答复,或与Spring Boot Autoconfiguration等无关.

我不断得到Property 'dataSource' is required错误,经过努力,如果最终设法将application-config.xml文件与bean 链接,但无法设法为JDBC的数据源自动装配.

我绝望地完成它并严重阻止,出于想法,如果有人可以提供最新的示例与Spring Boot自动配置,XML中的bean查找,JDBC的自动装配数据源,我会很高兴.

或者至少是一些想法,线索,甚至是如何寻找它,因为我甚至没有谷歌的关键词.

谢谢!

在此输入图像描述

Spring Application类.

package ws;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ComponentScan
@ImportResource("classpath:spring/application-config.xml")
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

Web服务类.

package ws;

import dao.UserDAOImpl;
import model.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public …
Run Code Online (Sandbox Code Playgroud)

spring datasource jdbc autowired spring-boot

15
推荐指数
1
解决办法
5万
查看次数

我不能@Autowire存在于依赖的Library Jar中的Bean吗?

我有一个Spring Boot应用程序(Y),它依赖于一组打包为x.jar的库文件,并在应用程序Y的pom.xml中作为依赖项提到.

x.jar有一个名为(User.java)的bean应用程序Y有一个名为(Department.java)的java类

当我尝试在Department.java中自动装配User.java的实例时,我收到以下错误

我不能@Autowire存在于依赖的Library Jar中的Bean吗?

无法自动装配字段:private com.User user; 嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型[com.User]的限定bean:期望至少有一个bean可以作为此依赖项的autowire候选者.依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

没有找到[com.User]类型的限定bean用于依赖:预期至少有1个bean符合此依赖关系的autowire候选者.依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}**

这是Spring Boot应用程序'Y'中的代码

package myapp;

@Component
public class Department {

    @Autowired
    private com.User user;

    //has getter setters for user

}
Run Code Online (Sandbox Code Playgroud)

这是Library x.jar中User.java的代码

 package com;

@Component
@ConfigurationProperties(prefix = "test.userproperties")
public class User {

  private String name;
  //has getter setters for name    
}
Run Code Online (Sandbox Code Playgroud)

这是应用程序Y的pom.xml中x.jar的依赖项

      <groupId>com.Lib</groupId>
      <artifactId>x</artifactId>
      <version>001</version>
    </dependency>   
Run Code Online (Sandbox Code Playgroud)

这是应用程序'Y'中的Main类

@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableZuulProxy
@EnableGemfireSession(maxInactiveIntervalInSeconds=60)
@EnableCircuitBreaker
@EnableHystrixDashboard
@EnableDiscoveryClient
public class ZuulApplication {

    public static void main(String[] args) …
Run Code Online (Sandbox Code Playgroud)

java spring autowired

15
推荐指数
1
解决办法
2万
查看次数

Spring:根据配置文件选择@Service

我有一个接口定义如下:

public interface MyService {
}
Run Code Online (Sandbox Code Playgroud)

实现它的两个类:

@Service
@Profile("dev")
public class DevImplementation implements MyService {
}
Run Code Online (Sandbox Code Playgroud)

@Service
@Profile("prod")
public class ProdImplementation implements MyService {
}
Run Code Online (Sandbox Code Playgroud)

还有另一项服务尝试使用它:

@Service
public MyClass {
    @Autowired
    MyService myservice;
}
Run Code Online (Sandbox Code Playgroud)

问题是我NoSuchBeanException在运行代码时遇到了问题.它运行使用

mvn spring-boot:run -P dev

我究竟做错了什么?

java spring autowired spring-profiles

15
推荐指数
2
解决办法
6828
查看次数

Spring + Hibernate,将autowire sessionFactory转换为hibernate DAO

我有一个Hibernate的DAO,在根据Hibernate的API 3春天3.x中,我用一个简单的sessionFactoryNOTHibernateDaoSupport+ getHibernateTemplate()-我希望这是一个不错的选择-

现在我的目标是sessionFactory使用注释自动装入我的DAO.

spring.xml有这个:

<context:component-scan base-package="data" />
Run Code Online (Sandbox Code Playgroud)

内部数据包我有我所有的DAO和服务类.

这很简单HibernateDao:

@Repository
public class PersonHDAO implements PersonDAO {

 private SessionFactory sessionFactory;

 @Autowired
 public void setSessionFactory(SessionFactory sessionFactory) {
     this.sessionFactory = sessionFactory;
 }

 public List<Person> findAll(){
  return sessionFactory.getCurrentSession().createQuery("bla bla").list();
 }
}
Run Code Online (Sandbox Code Playgroud)

我在spring.xml加载过程中没有错误,但sessionFactory仍然是null.

我该怎么办?

编辑

这是我sessionFactoryspring.xml以下方面的声明:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context" …
Run Code Online (Sandbox Code Playgroud)

spring hibernate sessionfactory autowired

14
推荐指数
1
解决办法
4万
查看次数

春天autowiring setter /构造函数PROs和CONs

使用@Autowired(不是xml配置)时,是否有人可以比较set/constructor绑定的优缺点?

请参阅以下示例:

public class Example{
   private Logger log;
   // constructor wiring
   @Autowired 
   public Example(Logger log){
      this.log = log;
   }
}

public class Example{
   // setter wiring
   @Autowired 
   private Logger log;
}
Run Code Online (Sandbox Code Playgroud)

setter spring constructor autowired

14
推荐指数
2
解决办法
3826
查看次数

自动装配由EasyMock工厂方法生成的bean?

我有一个看起来很奇怪的问题.我有以下设置:

界面:

package com.example;

public interface SomeDependency {
}
Run Code Online (Sandbox Code Playgroud)

弹簧组件:

package com.example;

@Component
public class SomeClass {
}
Run Code Online (Sandbox Code Playgroud)

带有由EasyMock生成的模拟bean的spring test配置:

<beans ....>
    <context:component-scan base-package="com.example"/>

    <bean id="someInterfaceMock" class="org.easymock.EasyMock" factory-method="createMock">
        <constructor-arg value="com.example.SomeDependency" />
    </bean> 
</beans>
Run Code Online (Sandbox Code Playgroud)

并进行单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testconfig.xml")
public class SomeClassTest {

    @Autowired
    SomeClass someClass;

    @Autowired
    SomeDependency someDependency;

    @Test
    public void testSomeClass() throws Exception {
        assertNotNull(someClass);
    }

    @Test
    public void testSomeDependency() throws Exception {
        assertNotNull(someDependency);
    }
}
Run Code Online (Sandbox Code Playgroud)

项目编译并且测试通过没有任何问题,即SomeClass("真实"对象)和SomeDependency(由EasyMock生成的模拟对象)的自动装配成功.

但是,如果我将SomeClass的实现更改为:

@Component
public class SomeClass { …
Run Code Online (Sandbox Code Playgroud)

java spring easymock factory-method autowired

14
推荐指数
1
解决办法
1万
查看次数

清洁代码 - 应用@Autowired应该在哪里?

我将从一个简单的例子开始.你有一个Spring启动应用程序,它CommandLineRunner在初始化时运行一个类.

// MyCommandLineRunner.java
public class MyCommandLineRunner implements CommandLineRunner {
    private final Log logger = LogFactory.getLog(getClass());
    @Autowired //IntelliJ Warning
    private DataSource ds;
    @Override
    public void run(String... args) throws Exception {
        logger.info("DataSource: " + ds.toString());
    }
}
// Application.java
@SpringBootApplication
public class Application {
    public static void main(String... args) {
        SpringApplication.run(Application.class, args); 
    }
    @Bean
    public MyCommandLineRunner schedulerRunner() {
        return new MyCommandLineRunner();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,像这样,这个工作,一切都很好.但是,IntelliJ会在哪里发出警告@Autowired(我在评论中标记了哪里)

Spring团队建议:始终在bean中使用基于构造函数的依赖注入.始终使用断言来强制依赖.

现在如果我遵循这个,我有一个基于构造函数的依赖注入

@Autowired
public MyCommandLineRunner(DataSource ds) { ... }
Run Code Online (Sandbox Code Playgroud)

这也意味着我必须编辑Application.java,因为构造函数需要一个参数.在Application.java …

java spring coding-style autowired spring-boot

14
推荐指数
2
解决办法
8991
查看次数