0

Web アプリケーションを Spring に変換しています。自動配線は、Spring コンテキストで開始された場合は成功しますが、他の状況では失敗するはずです。

MangaBeanという名前のプロパティを持つ がありますgenre。Genre の値は、除外された一連のジャンルからの 1 つである必要があります。検証を 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
    }
}

MangaDaoNamedParameterJDBCTemplateDB からジャンルをフェッチする autowired が含まれています。

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に対してのみ機能します。インスタンス化された 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 に答える