ドキュメントには、ValidatorFactory はスレッドセーフであると記載されていますが、以下に示すように、注釈付きサービス「InvService」をクラス プロパティとして使用することに懸念があります。
このアプローチがスレッドセーフかどうか疑問に思っていますか? 基本的に、制約違反に基づいてデータベース検索を行う必要があります。
public class MyValidator {
@Autowired
InvService invService; // ??????
private final ValidatorFactory factory;
public MyValidator() {
factory = Validation.buildDefaultValidatorFactory();
}
public <T> void validate(final T instance) {
final Validator validator = factory.getValidator();
final Set<ConstraintViolation< T>> violations = validator.validate(instance, Default.class);
if (!violations.isEmpty()) {
final Set<ConstraintViolation<?>> constraints = new HashSet<ConstraintViolation<?>>(violations.size());
for (final ConstraintViolation<?> violation : violations) {
constraints.add(violation);
}
getDBRecords(constraints);
throw new ConstraintViolationException(constraints);
}
}
private getDBRecords(Set<ConstraintViolation<?>> constraints) {
invService.get(....);
}
}
サービスクラスは次のようになります。
@Service
public class InvServiceImpl implements InvService {
@Autowired
private InvDAO InvDAO;
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public <T extends InvContent> getProduct(String InvKey) {
return InvDAO.getInvContent(InvKey, TYPEPROD, Product.class);
}
}