2012-07-30 16 views
7

हमारी परियोजना में हमारे पास अलग मेवेन मॉड्यूल में सेवा और डीएओ परतें हैं। सेवा मॉड्यूल डीएओ मॉड्यूल पर निर्भर करता है और इसकी इकाइयों के साथ काम करता है। समस्या यह है कि हम कस्टम जेएसआर 303 बाधा नहीं डाल सकते हैं जो डीएओ इकाई में सेवा परत से कुछ सेवाओं का उपयोग करता है क्योंकि इससे डीएओ परत से सेवा परत में बैक रेफरेंस बन जाएगा, क्योंकि वैधकर्ता वर्ग को मान्य में संदर्भित किया जाना चाहिए कस्टम की विशेषता @Constraint।@Constraint मान्य के कारण परतों के बीच पार निर्भरता से कैसे बचें?

रनटाइम पर कुछ कस्टम बाधा के वैधकर्ता वर्ग निर्दिष्ट करने के लिए कोई तरीका है (मानक जेएसआर 303 एपीआई का उपयोग करके) (या किसी अन्य तरीके से हमारी समस्या का समाधान)? निर्मित बाधाओं में खाली विशेषता है, लेकिन विशेषता नहीं है, लेकिन मुझे नहीं पता कि इसके लिए कुछ एपीआई है या नहीं।

+0

आप programers.se की कोशिश की है: हम पहले इसी प्रकार की एक सेम के लिए वसंत संदर्भ में देख कर इसे बढ़ाया? – Pureferret

उत्तर

4

सत्यापनकर्ता कार्यान्वयन के लिए एनोटेशन से संदर्भ से बचने के लिए आप अपनी बाधा के लिए एक वैधकर्ता असाइन करने के लिए XML based constraint mapping का उपयोग कर सकते हैं।

BV 1.1 EG भी discussing उस क्षेत्र में कुछ सुधार है। mailing list पर इस मुद्दे पर वजन करने के लिए स्वतंत्र महसूस करें।

+0

हाइबरनेट वैलिडेटर के साथ काम करते समय, आप सेवा लोडर तंत्र का उपयोग [बाधा वैधताएं ढूंढने] [https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#_constraint_definitions_via_code_serviceloader_code) पर भी कर सकते हैं, बाधा एनोटेशन प्रकार से किसी भी लिंक से इसके सत्यापनकर्ता से परहेज करें। – Gunnar

9

हमें हमारे वसंत आधारित परियोजना में एक ही समस्या का सामना करना पड़ा। इसे सबसे अच्छे वसंत तरीके से हल करने के लिए हम ConstraintValidator इंटरफ़ेस और कार्यान्वयन को विभाजित करते हैं।

public interface UniqueValidator extends ConstraintValidator<Unique, String> { 
} 

सेवा परत में हम कि इंटरफ़ेस को लागू:

public class UniqueValidatorJpaImpl implements UniqueValidator { 
    private EntityManager entityManager; 
    ... 
} 

अगला हम UniqueValidatorJpaImpl के लिए स्प्रिंग संदर्भ में एक सेम की घोषणा डोमेन परत में उदाहरण के लिए हम केवल इंटरफ़ेस होता है।

आखिरकार उन सभी कर्मचारियों को काम करने के लिए हमने स्प्रिंगकोनस्ट्रेनट वैलिडेटेटर फैक्ट्री बढ़ा दी। डिफ़ॉल्ट रूप से यह केवल मान्य में निर्दिष्ट वर्ग का एक नया उदाहरण बनाता है।

public class SpringConstraintValidatorFactoryEx implements ConstraintValidatorFactory { 

    private final Logger logger = LoggerFactory.getLogger(SpringConstraintValidatorFactoryEx.class); 

    @Autowired 
    private AutowireCapableBeanFactory beanFactory; 

    public <T extends ConstraintValidator<?, ?>> T getInstance(Class<T> key) { 
     T bean = null; 

     try { 
      logger.info("Trying to find a validator bean of class " + key.getSimpleName()); 
      bean = this.beanFactory.getBean(key); 
     } catch (BeansException exc) { 
      logger.info("Failed to find a bean of class " + key.getSimpleName()); 
     } 

     if (bean == null) { 
      try { 
       logger.info("Creating a new validator bean of class " + key.getSimpleName()); 
       bean = this.beanFactory.createBean(key); 
      } catch (BeansException exc) { 
       logger.info("Failed to create a validator of class " + key.getSimpleName()); 
      } 
     } 

     if (bean == null) { 
      logger.warn("Failed to get validator of class " + key.getSimpleName()); 
     } 

     return bean; 
    } 

} 
+0

शुद्ध जावा ईई परियोजना यहां (कोई वसंत नहीं), जहां एक समान समाधान काम करेगा। केवल कुछ ही आसान: आप केवल सत्यापन विधि (किसी भी चीज़ को विस्तारित करने की आवश्यकता नहीं) के साथ एक इंटरफेस को कार्यान्वित करते हैं, इसे सेवा परत में कार्यान्वित करते हैं, और सीधे डोमेन परत में सत्यापनकर्ता में इंजेक्ट करते हैं। – ymajoros

+0

शुद्ध जावा ईई परियोजना यहां (कोई वसंत नहीं), जहां एक समान समाधान काम करेगा। केवल कुछ ही आसान: आप केवल सत्यापन विधि (किसी भी चीज़ को विस्तारित करने की आवश्यकता नहीं) के साथ एक इंटरफेस को कार्यान्वित करते हैं, इसे सेवा परत में कार्यान्वित करते हैं, और सीधे डोमेन परत में सत्यापनकर्ता में इंजेक्ट करते हैं। – ymajoros