@FunctionalInterface public interface RequiredWordProvider
CsvWordRequire
による必須語彙のチェックを行う際の語彙を提供するためのインタフェースです。
語彙を別ファイルやDBから取得する時などサービスクラスとして実装します。
基本的な使い方は、 CsvWordRequire
のJavaDocを参照してください。
フィールドごとにリソースを切り替えたい場合は、メソッドの引数FieldAccessor
で判定を行います。
また、独自のパラメータを渡したい時は、独自のアノテーションを作成し、それをフィールドに付与して、
引数FieldAccessor
から取得して判定します。
// 読み込むリソースを定義されているフィールドやクラスで分ける場合
public class FileRequiredWordProvider implements RequiredWordProvider {
@Override
public Collection<String> getRequiredWords(final FieldAccessor field) {
final String path;
if(field.getDeclaredClass().equals(AdminCsv.class)) {
path = "required_word_admin.txt";
} else {
path = "required_word.txt";
}
try {
return Files.readAllLines(new File(path).toPath(), Charset.forName("UTF-8"));
} catch (IOException e) {
throw new RuntimeException("fail reading the required words file.", e);
}
}
}
Springと連携している場合は、プロバイダクラスをSpringBeanとして登録しておくことでインジェクションできます。
また、メソッドgetRequiredWords(FieldAccessor)
は、定義したフィールド単位に呼ばれるため、多数のフィールドで定義していると何度も呼ばれ、効率が悪くなる場合があります。
このようなときは、Spring Framework3.1から追加された Cache Abstraction(キャッシュの抽象化)機能を使うと改善できます。
// SpringBeanとして登録する場合。
@Service
@Transactional
public class RequiredWordProviderImpl implements RequiredWordProvider {
// リポジトリのインジェクション
@Autowired
private RequiredWordRepository requiredWordRepository;
@Override
public Collection<String> getRequiredWords(final FieldAccessor field) {
final Role role;
if(field.getDeclaredClass().equals(AdminCsv.class)) {
role = Role.admin;
} else {
role = Role.normal;
}
return loadWords(role).stream()
.map(dto -> dto.getWord())
.collect(Collectors.toList());
}
// リポジトリから取得した内容をキャッシュする。
// 引数 role をキーにして、区別する。
@Transactional(readOnly = true)
@Cacheable(cacheNames="requiredWords", key="#role")
public List<WordDto> loadWords(Role role) {
if(role.euals(Role.admin)) {
return requiredWordRepository.findByRole(role);
} else {
return requiredWordRepository.findAll();
}
}
}
修飾子とタイプ | メソッドと説明 |
---|---|
Collection<String> |
getRequiredWords(FieldAccessor field)
語彙の一覧を取得する。
|
Collection<String> getRequiredWords(FieldAccessor field)
field
- フィールド情報Copyright © 2022 mygreen. All rights reserved.