0

将我的 Web 应用程序转换为 Spring。自动装配在它在 Spring 上下文中启动但在其他情况下失败的情况下是成功的,因为它应该。

我有一个MangaBean名为genre. Genre 的值应该是一组例外的流派中的一个。我已将验证放在 bean 本身中。像这样的东西:

    @Component
public class MangaBean{
    private String title;
    private String author;
    private String isbn;
    private String genre;

    //getters

    public void setTitle(String title){
        //validations
    }

    public void setGenre(String genre){
        boolean result=MangaUtil.verifyGenre(genre);
        if(result){
            this.genre=genre;
        }else{
            this.genre=null;
        }
    }
}

该实用程序调用从表中获取一组流派并验证提供的流派的方法。

@Component
public class MangaUtil{
    @Autowired
    MangaDao mDao;

    public static boolean verifyGenre(String genre){
        List<String> genres=mDao.getGenresList();   //null pointer exception 
            //do validations
    }
}

MangaDao包含一个NamedParameterJDBCTemplate从数据库中获取流派的自动连线。

MangaDao的代码:

@Repository
public class MangaDao{
    @Autowired
    private NamedParameterJdbcTemplate template;

    public List<String> getGenresList(){
        String query="select genres from manga_table";
        Map<String,String> paramMap=new HashMap<String, String>();
        return template.queryForList(query, paramMap, String.class);
    }
}

在上述安排中,当我自动装配 MangaUtil 时,对 MangaUtil 的调用也可以正常工作。例子:

@Component
public class MangaBean{
    @Autowired
    MangaUtil mangaUtil;
    private String title;
    private String author;
    private String isbn;
    private String genre;

    //getters

    public void setTitle(String title){
        //validations
    }

    public void setGenre(String genre){
        boolean result=mangaUtil.verifyGenre(genre);
        if(result){
            this.genre=genre;
        }else{
            this.genre=null;
        }
    }
} 

但是,如果我在 bean 中使用自动装配,那么在我自己实例化 bean 的情况下,自动装配会失败MangaBean mb=new MangaBean()。请对这种情况提出建议。我想从我的 bean 调用验证器方法,而 bean 本身没有任何自动装配。可能吗?. 如果没有,有什么方法可以存储流派列表并在 bean 中使用它来验证我的数据。请指教。

4

2 回答 2

1

默认情况下,自动装配仅适用于 Spring 托管的 bean,即由 Spring 创建的。要使其适用于实例化的 bean,new请参见 Spring 文档:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable

您需要使用 @Configurable 注释并按照文档配置 AspectJ。

于 2012-12-26T06:41:32.390 回答
0

也许不是您问题的真正答案。但我想知道你是如何编译这段代码的:

@Component
public class MangaUtil(){ // <<< parentheses not allowed here
    @Autowired
    MangaDao mDao;

    public static boolean verifyGenre(String genre){
        List<String> genres=mDao.getGenresList();   // <<< you are referencing a non static attribute from a static method
    }
}
于 2012-12-26T12:49:40.663 回答