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