我有一个带有spring 3.0的Web应用程序.我需要使用来自cron的main方法运行一个类,该cron使用appcontext xml中定义的bean(使用组件扫描annocations).我的主类在同一个src目录中.如何从Web上下文中将bean注入main方法.我试着用它来做
ApplicationContext context = new ClassPathXmlApplicationContext("appservlet.xml");
Run Code Online (Sandbox Code Playgroud)
我尝试使用AutoWired,它返回一个空bean.所以我使用了应用程序ctx,这是在运行main方法时创建一个新的上下文(如预期的那样).但是我可以使用容器中的现有bean吗?
@Autowired
static DAO dao;
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("xman- servlet.xml");
TableClient client = context.getBean(TableClient.class);
client.start(context);
}
Run Code Online (Sandbox Code Playgroud) spring program-entry-point dependency-injection inversion-of-control autowired
在我的应用程序中,我使用自动连接User到我的服务的bean,MyService并将其用作登录用户信息的原则(因此用户不是从xml作为静态bean而是从登录用户动态生成)如果有登录的十个用户我将有十个该@AutoWired User领域的候选人.(对吗?)我可以在Spring容器中找到其中任何一个cos AutoWired,而不是会话.
告诉我,如果我错了.以及如果可能的话如何实际解决它.但是如果我的AutoWired字段被注释了怎么办呢@Scope ("Session")
像这样 :
@Component("user")
@Scope("session")
public class User
{
String userid;
String name;
//getter setters etc
}
Run Code Online (Sandbox Code Playgroud)
@Component
public class MyService
{
@Autowired
private User user;
}
Run Code Online (Sandbox Code Playgroud)
当我调用MyServiceComponent 时,是否可以获取其他用户的User bean .Cos MyService只是@Component即使它User是@Scope(session).
基本上,(如果我的假设是错的)我认为当你@Autowire是一个字段时,它会将容器视为整体并且容器不会被分成每个会话的子容器.
根据Spring的文档,使用TaskExecutor的方法如下:
import org.springframework.core.task.TaskExecutor;
public class TaskExecutorExample {
private class MessagePrinterTask implements Runnable {
private String message;
public MessagePrinterTask(String message) {
this.message = message;
}
public void run() {
System.out.println(message);
}
}
private TaskExecutor taskExecutor;
public TaskExecutorExample(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void printMessages() {
for(int i = 0; i < 25; i++) {
taskExecutor.execute(new MessagePrinterTask("Message" + i));
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果MessagePrinterTask具有自动连接的依赖关系,它们将不会被Spring配置,因为我们在Spring的上下文之外实例化我们的bean(至少我理解它是这样),即使Spring将提供实际的线程创建.如果MessagePrinterTask具有自动连接的依赖关系,我们如何让Spring识别它们?我尝试了以下修改示例无效(是的,正确启用了自动装配):
import org.springframework.core.task.TaskExecutor;
public class TaskExecutorExample {
@Component
private class MessagePrinterTask implements Runnable { …Run Code Online (Sandbox Code Playgroud) Cobertura仪器在特定情况下打破弹簧自动装配.有谁知道如何解决这个问题?
尝试在myService中自动装配myExecutor的已检测版本时,自动装配失败.在添加MyHappyExecutor和MySadExecutor之前,此工作正常.MyHappyExecutor和MySadExecutor是自动装配的,并且仅在MyExecutor中使用.
我已经附加了下面的异常输出.请注意,类和包名称已被编辑.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myService': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.mycompany.executor.MyExecutor com.mycompany.service.impl.MyServiceImpl.myExecutor;
nested exception is java.lang.IllegalArgumentException: Can not set com.mycompany.executor.MyExecutor field com.mycompany.service.impl.MyServiceImpl.myExecutor to $Proxy20
Run Code Online (Sandbox Code Playgroud)
Cobertura仪表过程中的某些东西会影响Springs的自动装配.
强制CGLIB类代理将错误类型更改为"java.lang.NoClassDefFoundError"错误.这会影响标准测试目标以及Cobertura目标.
<aop:config proxy-target-class="true"/>
Run Code Online (Sandbox Code Playgroud)
以下是有关3个类的弹簧启动过程的输出.
2012-11-01 16:21:51 INFO [main] Overriding bean definition for bean 'myExecutor': replacing [Generic bean: class [com.mycompany.executor.MyExecutor]; scope=; abstract=false; lazyInit=false; autowireMode=1; dependencyCheck=0; autowireCandidate=true; …Run Code Online (Sandbox Code Playgroud) 是否可以在Validation类中自动装配对象?对于应该是Autowired的对象,我一直都为null ...
这个例子有点人为; 我简化了它以删除无关的细节,并专注于我遇到的问题.我有一个看起来像这样的验证器:
@Component
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Autowired
UsernameService usernameService;
@Override
public void initialize(UniqueUsername uniqueUsername) {
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !usernameService.exists(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我从我的控制器调用验证器,如下所示:
@RequestMapping
public void checkUsername(Model model, User user) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
model.addAttribute("error", constraintViolations.size() > 0);
}
Run Code Online (Sandbox Code Playgroud)
但是,我一直有NullPointerException例外.我在验证器添加一个断点,并看到usernameService了null.为什么不进行自动装配?最初我认为这是因为我没有注释验证器@Component,但即使在注释它之后我仍然有同样的问题.该UsernameService班已经标注了@Service,我可以验证它的构造函数获取调用.
我是Spring的新手,所以我甚至不确定将服务连接到验证器是否可以.我究竟做错了什么?
我们有Spring MVC应用程序.我们正在尝试将Spring安全性集成到其中.
我们编写了自定义身份验证提供程序,它将执行身份验证工作.
以下是我的自定义身份验证提供程序的代码.
public class CustomAuthenticationProvider extends DaoAuthenticationProvider {
@Autowired
private AuthenticationService authenticationService;
@Override
public Authentication authenticate(Authentication authentication) {
CustomAuthenticationToken auth = (CustomAuthenticationToken) authentication;
String username = String.valueOf(auth.getPrincipal());
String password = String.valueOf(auth.getCredentials());
try {
Users user = new User();
user.setUsername(username);
user.setPassword(PasswordUtil.encrypt(password));
user = authenticationService.validateLogin(user);
return auth;
} catch (Exception e) {
throw new BadCredentialsException("Username/Password does not match for " + username);
}
}
@Override
public boolean supports(Class<? extends Object> authentication) {
return (CustomAuthenticationToken.class.isAssignableFrom(authentication));
}
}
Run Code Online (Sandbox Code Playgroud)
这里我在以下行获取NullpointerException
user = authenticationService.validateLogin(user); …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序有2个同名的bean,但它们在不同的包中.我的Spring应用程序失败,因为它无法决定采用哪个bean.这有什么解决方案吗?Bean目前不实现特定的接口.
请参阅下面一个已编辑的异常示例:
Caused by:
org.springframework.context.annotation.ConflictingBeanDefinitionException:
Annotation-specified bean name 'dataTransferHandler' for bean class
[aaaaa.ws.handler.DataTransferHandler] conflicts with existing,
non-compatible bean definition of same name and class
[bbbbb.ws.handler.DataTransferHandler]
Run Code Online (Sandbox Code Playgroud) 嗨我想从属性文件autowire boolean值已经引用以下链接与地图url Spring属性(property-placeholder)自动装配
但我想自动连接一个布尔属性,也提到了问题Spring Autowire原始布尔 Spring Autowire原始布尔值, 但那是bean值,在我的情况下我想使用点分隔的属性值做同样的事情.
${does.it.allow}
//它失败,并给出字符串不能转换为boolean
#{does.it.allow}
//这给用名称来定义无豆/属性确实,但我有正确的属性文件,它证明了容器能够加载它,因为第一个错误.
是否可以使用JUnit插件/采样器和Spring Java配置运行JMeter?当我尝试这样做时,没有创建Spring自动装配的bean,虽然测试用例运行,因为尚未创建bean,我得到空指针异常.
我正在使用Spring注释
@SpringJUnit4ClassRunner并@ContextConfiguration配置JUnit测试(可以工作).目标是能够编写可以使用JMeter测量性能的JUnit测试用例.
autowired ×10
spring ×9
annotations ×1
cobertura ×1
java ×1
jmeter ×1
junit ×1
maven ×1
spring-3 ×1
spring-mvc ×1
validation ×1