我正在使用Spring 3和Spring Security开发一个项目.我的问题是IoC容器.当我UserDetailsService为Spring Security-3 编写自己的实现时问题就出现了.我检查了其他问题,但仍无法解决问题.
问题的定义是:
我有两个单独的类(一个是UsersController.java扩展的@Controller,ProjectUserDetailsService哪个扩展@Service),它使用一个公共对象进行自动装配.但是当对象成功自动装入时UsersController,它就null在ProjectUserDetailsService类中,尽管这个类(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) 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)
在测试这个类时,我基本上有四种注入模拟依赖项的方法:
哪个最好,为什么?
---更新---
我想我应该更清楚一点 - 我只是谈论"单元"样式测试,而不是Spring"集成"样式测试,其中依赖关系可以使用Spring上下文连接.
我能够使用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关键字有关)?
我是Spring和J2EE的新手.我在使用带有Spring Boot自动配置的JDBC模板时遇到了麻烦.
我做的是我采用这里提供的RESTful Web服务的例子, 并决定扩展它以使用JDBC模板关系数据库访问.不幸的是,提供的另一个例子没有用,因为不考虑从xml beans文件提供dataSource的唯一困难.
我尝试了在Stack或Google上找到的所有内容.大多数示例都严重过时或未得到答复,或与Spring Boot Autoconfiguration等无关.
我不断得到Property 'dataSource' is required错误,经过努力,如果最终设法将application-config.xml文件与bean 链接,但无法设法为JDBC的数据源自动装配.
我绝望地完成它并严重阻止,出于想法,如果有人可以提供最新的示例与Spring Boot自动配置,XML中的bean查找,JDBC的自动装配数据源,我会很高兴.
或者至少是一些想法,线索,甚至是如何寻找它,因为我甚至没有谷歌的关键词.
谢谢!

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)
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 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) 我有一个接口定义如下:
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
我究竟做错了什么?
我有一个Hibernate的DAO,在根据Hibernate的API 3和春天3.x中,我用一个简单的sessionFactory和NOT的HibernateDaoSupport+ 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.
我该怎么办?
编辑
这是我sessionFactory在spring.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) 使用@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) 我有一个看起来很奇怪的问题.我有以下设置:
界面:
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) 我将从一个简单的例子开始.你有一个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 …
autowired ×10
spring ×10
java ×6
spring-boot ×2
coding-style ×1
constructor ×1
datasource ×1
easymock ×1
hibernate ×1
jdbc ×1
mocking ×1
setter ×1
spring-mvc ×1