2015-11-20 6 views
8

वसंत बूट में संपत्ति प्लेसहोल्डर के लिए उपसर्ग और प्रत्यय को बदलने का सबसे आसान तरीका क्या है?वसंत बूट: संपत्ति प्लेसहोल्डर हस्ताक्षर बदलें

डिफ़ॉल्ट @Value("${some.property}") है, हालांकि यह कोटलिन में बदसूरत दिखता है, क्योंकि इसे बचने की आवश्यकता है - $ {कुछ} स्ट्रिंग टेम्पलेट्स के लिए कोटलिन में एक भाषा सुविधा है।

+0

मुझे पूरा यकीन है कि आप ऐसा करने में सक्षम नहीं होंगे, जैसा कि स्पेल में परिभाषित किया गया है (सामान्य ईएल से विरासत में मिला है)। क्या कोटलिन के पास ग्रोवी के एकल-उद्धरण के बराबर नहीं है "स्ट्रिंग नहीं करें" स्ट्रिंग? – chrylis

+1

आप हमेशा, '@ कॉन्फ़िगरेशनप्रॉपर्टीज' का उपयोग कर सकते हैं। – chrylis

उत्तर

20

यह अपने विन्यास में निम्नलिखित सेम की घोषणा के द्वारा इस्तेमाल किया उपसर्ग अनुकूलित करने के लिए संभव है:

@Bean 
fun propertyConfigurer() = PropertySourcesPlaceholderConfigurer().apply { 
    setPlaceholderPrefix("%{") 
} 

आप किसी भी मौजूदा कोड है कि ${...} सिंटैक्स का उपयोग कर रहा है (वसंत बूट प्रवर्तक या @LocalServerPort) की तरह है, तो आप घोषित करना चाहिए:

@Bean 
fun kotlinPropertyConfigurer() = PropertySourcesPlaceholderConfigurer().apply { 
    setPlaceholderPrefix("%{") 
    setIgnoreUnresolvablePlaceholders(true) 
} 

@Bean 
fun defaultPropertyConfigurer() = PropertySourcesPlaceholderConfigurer() 

@Value("\${some.property}") में की तरह डॉलर पलायन एक और संभावित विकल्प है कि कोई @Bean घोषणा की आवश्यकता है।

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) के साथ कॉन्फ़िगर किए गए स्प्रिंग बूट परीक्षणों के लिए आप @Value("\${local.server.port}") के बजाय @LocalServerPort का उपयोग कर सकते हैं।

@ConfigurationProperties विशेष रूप से कोटलिन डेटा कक्षाओं के साथ बेहतर विकल्प होगा, लेकिन वर्तमान में आपको कोटलिन कक्षाओं का उपयोग शून्य से var गुणों के साथ करना होगा क्योंकि केवल गेटर/सेटर समर्थित हैं। आप this issue के लिए वोट दे सकते हैं या स्प्रिंग बूट 2.x में समर्थित होने में आपकी रूचि दिखाने के लिए टिप्पणी कर सकते हैं।

+0

के साथ आगे बढ़ रहा हूं क्या कोटलिन डेटा कक्षाओं के साथ @ कॉन्फ़िगरेशनप्रॉपर्टीज का उपयोग करना संभव है, या इसे नियमित रूप से खुली कक्षा होनी चाहिए? – AAverin

+0

समस्या कन्स्ट्रक्टर इंजेक्शन है। यदि आप कन्स्ट्रक्टर में गुण बनाने का प्रयास करते हैं, तो स्प्रिंग कॉन्फ़िगरेशन गुणों के बजाय बीन्स के लिए खोज करता है। @ सेबेस्टियन डेलेज़ कॉन्फ़िगरेशनप्रॉपर्टीज कक्षाओं के लिए बीन इंजेक्शन को अक्षम करने का कोई तरीका है? –

+0

स्प्रिंग बूट 1 में समर्थित नहीं है।एक्स, हम स्प्रिंग बूट 2.x में समर्थन करने पर चर्चा कर रहे हैं: https://github.com/spring-projects/spring-boot/issues/8762। –

1

उनके पास @ConfigurationProperties के साथ एनवाएटेड जावा कक्षाओं का उपयोग करके एक नई सुविधा है। यह कोटलिन में अच्छा लग रहा है और बचा रहा है। आप इसे आजमाइए चाहिए:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties

+0

मुझे लगता है कि [यह लिंक] (https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-typesafe-configuration-properties) एक बेहतर प्रविष्टि है सुविधा के लिए बिंदु। शायद आप इसके साथ अपना जवाब संपादित कर सकते हैं? –

+0

आपकी मदद से मुझे एक समाधान मिला जो मैं खुश हूं (नीचे देखें)। धन्यवाद। –

+0

कूल। ऐसा लगता है कि इसे चलाने के लिए आपको बहुत सारे विचार थे। मैं ठीक हूं अगर आप अपने जवाब में "टिक" डालते हैं। मैंने इसे पहले से हटा दिया है – d0x

2

dox द्वारा प्रदान की जवाब से सलाह का उपयोग करना, मैं की तरह कुछ के साथ जा रहा समाप्त हो गया:

public interface TokenAuthenticationConfig { 

public fun apiKey() : String 

} 

@Component 
@ConfigurationProperties(prefix = "service.api") 
public open class TokenAuthenticationConfigImpl : TokenAuthenticationConfig 
{ 
    public var apiKey : String 

    constructor() { 
     this.apiKey = "" 
    } 

    override fun apiKey(): String 
    { 
     return this.apiKey 
    } 
} 

वसंत में @ConfigurationProperties वस्तुओं जावा बीन्स पालन करना आवश्यक है पैटर्न और इसलिए, mutable हो। मेरे लिए कॉन्फ़िगरेशन ऐसा लगता है कि यह आम तौर पर पूरे ऐप जीवन चक्र में स्थिर होना चाहिए, और इसके बजाय राज्य के तर्क के जटिलता को जोड़ने के बजाय, अपरिवर्तनीय इंटरफ़ेस को इंजेक्शन दिया गया।