2015-10-09 10 views
6

स्प्रिंग बूट की फ्लाईवेप्रॉपर्टीज.जावा फ्लाईवे सेटिंग्स में से कई का समर्थन करता है लेकिन 'बेसलाइन वर्जन' या 'बेसलाइनऑनमिग्रेट' का उपयोग नहीं करता है, फ्लाईवे 'बेसलाइनऑनमिग्रेट' और 'बेसलाइन वर्जन' सेट करना। मैं एक मौजूदा एप्लिकेशन को फ्लाईवे में परिवर्तित कर रहा हूं और ये सेटिंग इस उद्देश्य के लिए डिज़ाइन की गई है। हमारे उत्पादन पर्यावरण को अत्यधिक नियंत्रित किया जाता है और इसे प्राप्त करने के लिए वहां फ्लाईवे के कमांडलाइन संस्करण को चलाने के लिए व्यावहारिक नहीं है।स्प्रिंग बूट प्रॉपर्टी फ़ाइल

क्या एक कस्टम फ्लाईवे @ बीन एकमात्र विकल्प बना रहा है?

उत्तर

6

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

@Profile(value = "!dbClean") 
@Bean(name = "flyway", initMethod = "migrate") 
public Flyway flywayNotADestroyer() { 
    Flyway flyway = new Flyway(); 
    flyway.setDataSource(dataSource()); 
    flyway.setBaselineOnMigrate(true); 
    return flyway; 
} 

@Profile(value = "dbClean") 
@Bean(name = "flyway", initMethod = "migrate") 
public Flyway flywayTheDestroyer() { 
    Flyway flyway = new Flyway(); 
    flyway.setDataSource(dataSource()); 
    flyway.setBaselineOnMigrate(true); 
    flyway.clean(); 
    return flyway; 
} 

आप मैं दो स्प्रिंग प्रोफाइल यहाँ देख सकते हैं। एक डिफ़ॉल्ट जो आपके डेटाबेस को साफ़ नहीं करेगा, और डेटाबेस की पूरी तरह से साफ करेगा। बेहद सुविधाजनक।

+0

धन्यवाद @goroncy

आप एक application.yml निम्नलिखित जोड़ें उपयोग कर रहे हैं। – dropofahat

0

स्रोत में खुदाई करने और कुछ प्रयोग चलाने के बाद, ऐसा लगता है कि सेटबास्लाइनवर्सन() फ्लाईवे कक्षा में अधिभारित है, वसंत संपत्ति मूल्य को इंजेक्ट करने में असमर्थ है।

फ्लाईवे। बेसलाइन VersionAsString = 2 वांछित के रूप में काम करता है।

4

मुझे एक FlywayMigrationStrategy का उपयोग करके सफलता मिली।

@Component 
public class BaselineOnMigrateMigrationStrategy implements FlywayMigrationStrategy { 
    @Override 
    public void migrate(Flyway flyway) { 
     flyway.setBaselineOnMigrate(true); 
     flyway.migrate(); 
    } 
} 
5

आप सेट कर सकते flyways गुण के किसी भी अपने application.yml/.properties में flyway के साथ उन्हें लगाकर किया।

यह org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration.FlywayConfiguration#flyway द्वारा संभव बनाया गया है जो @ConfigurationProperties(prefix = "flyway") के साथ एनोटेट किया गया है। यदि का उपयोग कर एक application.properties निम्नलिखित जोड़ें

flyway: 
    baselineOnMigrate: true 

:: मेरे संदेह की पुष्टि के लिए

flyway.baselineOnMigrate = true 
+1

वसंत बूट 2 में उपसर्ग "spring.flyway" है, इसलिए संपत्ति 'spring.flyway.baselineOnMigrate = true' है – pdem