自动装配不起作用?

时间:2011-11-12 05:15:37

标签: xml spring autowired

(Java Spring WebApp)

我有:

public class PersonValidator implements Validator {

private PersonDAO d;

@Autowired
public void setD(PersonDAO d) {
    this.d = d;
}
public void validate(Object target, Errors errors) {
\\ some logic
d.emailAlreadyExists("testMail@test.test"); 
}}

我以为我真的很了解豆子和自动装配 - 似乎没有。 “d.email ..”代码抛出空指针异常,它确实使用PersonDAO d的任何方法。据我所知,问题在于没有注入任何东西。

但是,如果我尝试将它注入使用此Validator的控制器,则一切正常:

@Controller
@RequestMapping("/person")
public class PersonController
{


private PersonDAO d;

@Autowired
public void setD(PersonDAO d) {
    this.d = d;
}

 // some method with RequestMapping declaration {
    Boolean b = d.emailAlreadyExists(person.getMail());       
logger.info( b.toString());

  // } end some method

虽然上面的代码不是我想要的。 我想将我的DAO注入PersonValidator,因为一些DAO的方法需要对db进行检查。这样它就可以按照以下方式工作:

 \\ these lines are in Controller under method
PersonValidator validator = new PersonValidator(); // my  d.emailAlreadyExists("testMail@test.test"); is inside
validator.validate(person, bindingResult); 

PersonDAO在xml中声明,但PersonValidator不在。我不能将Spring DAO bean注入到简单的java对象中,例如PersonValidator,它在xml中没有被删除吗?

(顺便说一下,组件扫描是好的 - 以防万一)

1 个答案:

答案 0 :(得分:1)

如果您正在对包含PersonValidator的包进行组件扫描,则只需在@Component类之上添加PersonValidator注释即可:

@Component
public class PersonValidator implements Validator {

根据您的需要,您可能还想更改单身默认范围:

@Component
@Scope("prototype")
public class PersonValidator implements Validator {

或者,您可以在Spring XML中声明PersonValidator。如果你不做这两件事中的一件事,Spring甚至都不会考虑你的对象,所以没有任何东西可以在其中自动装配。