0

ドキュメントには、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);
    }
}
4

1 に答える 1

0

それは異なります... InvServiceはスレッドセーフですか? もしそうなら、あなたは大丈夫です。スレッド セーフなクラスは、他のスレッド セーフなクラスのインスタンスを属性として参照することができ、それ自体はスレッド セーフなままです。ただし、参照しているオブジェクトがスレッドセーフであることを確認する必要があります。あなたがクラスを開発していないのであれば、それがスレッドセーフであると明示的に述べているドキュメントを見たいと思います。

于 2012-10-23T13:18:12.290 に答える