ওয়াইএএমএল ব্যবহার করে স্প্রিং @ প্রপার্টিসোর্স


107

স্প্রিং বুট আমাদের অ্যাপ্লিকেশন.প্রপার্টি ফাইলগুলি ওয়াইএএমএল সমতুল্য সঙ্গে প্রতিস্থাপন করতে দেয়। যাইহোক আমি আমার পরীক্ষাগুলি নিয়ে কিছুটা ধাক্কা মারছি বলে মনে হচ্ছে। যদি আমি আমার TestConfiguration(একটি সাধারণ জাভা কনফিগারেশন) টি টিকিয়ে রাখি তবে এটি কোনও সম্পত্তি ফাইলের প্রত্যাশা করে।

উদাহরণস্বরূপ এটি কাজ করে না: @PropertySource(value = "classpath:application-test.yml")

আমার YAML ফাইলে যদি এটি থাকে:

db:
  url: jdbc:oracle:thin:@pathToMyDb
  username: someUser
  password: fakePassword

এবং আমি এই জাতীয় কিছু দিয়ে এই মানগুলি লাভবান করব:

@Value("${db.username}") String username

যাইহোক, আমি শেষ করেছি এবং এর মতো ত্রুটি:

Could not resolve placeholder 'db.username' in string value "${db.username}"

আমি আমার পরীক্ষাগুলিতেও কীভাবে YAML সদ্ব্যবহার লাভ করতে পারি?


সংজ্ঞা "কাজ করে না।" ব্যতিক্রম / ত্রুটি / সতর্কতা কী?
এমারসন ফারুগিয়া

স্প্রিং বুট ওয়াইএএমএল ফাইলটিকে ফ্ল্যাট করে যাতে এটি বিন্দু চিহ্নিতকরণ সহ একটি সম্পত্তি ফাইল হিসাবে উপস্থিত হয়। চ্যাপ্টা হচ্ছে না।
চেককেটগুলি

এবং কেবল তা নিশ্চিত করার জন্য, এটি টেস্টবিহীন কোডে কাজ করে?
এমারসন ফারুগিয়া

1
হ্যাঁ. এখানে প্রজেক্ট.স্প্রিং.আইও / স্প্রিং- বুট / ডকস / স্প্রিং- বুট- অ্যাকুয়েটর/… ব্যাখ্যা করার জন্য একটি ডক এবং পৃষ্ঠার নীচের একটি উপায়ে বলা হয়েছে 'ওয়াইএএমএল অবজেক্ট পিরিয়ড বিভাজক ব্যবহার করে সমতল করা হয়েছে।'
চেকেট

9
স্পিনিং বুট বলেছে যে এটি প্রপার্টিসোর্স দিয়ে ইএএমএল লোড করতে পারে না: 24.6.4 ওয়াইএএমএল স্বল্পতা ইয়ামএল ফাইলগুলি @ প্রোপার্টিসোর্স টীকা দ্বারা লোড করা যায় না। সুতরাং যে ক্ষেত্রে আপনাকে সেইভাবে মানগুলি লোড করতে হবে, আপনার একটি বৈশিষ্ট্য ফাইল ব্যবহার করা উচিত।
লেক্স প্রো

উত্তর:


54

স্প্রিং-বুট এর জন্য একটি সহায়ক রয়েছে, কেবল যুক্ত করুন

@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)

আপনার পরীক্ষার ক্লাসগুলির শীর্ষে বা একটি বিমূর্ত পরীক্ষা সুপারক্লাস।

সম্পাদনা: আমি এই উত্তরটি পাঁচ বছর আগে লিখেছি। এটি স্প্রিং বুটের সাম্প্রতিক সংস্করণগুলির সাথে কাজ করে না। আমি এখন এটিই করছি (প্রয়োজনে কোটলিনটিকে জাভাতে অনুবাদ করুন):

@TestPropertySource(locations=["classpath:application.yml"])
@ContextConfiguration(
        initializers=[ConfigFileApplicationContextInitializer::class]
)

শীর্ষে যোগ করা হয়, তারপর

    @Configuration
    open class TestConfig {

        @Bean
        open fun propertiesResolver(): PropertySourcesPlaceholderConfigurer {
            return PropertySourcesPlaceholderConfigurer()
        }
    }

প্রসঙ্গে।



কল্পেশোনি @ কল্পেশ্বর না বলে, এটি কার্যকর হবে না।
ওলা সানডেল

এর পরিবর্তে আমাকে @ স্প্রিংজুনিট কনফিগ-এ আরম্ভকারীটি যুক্ত করতে হয়েছিল@SpringJUnitConfig(value = {...}, initializers = {ConfigFileApplicationContextInitializer.class})
টমাস এফ

1
@ জ্যান গ্যালিনস্কি আপনি আমার উত্তরটি চেষ্টা করতে পারেন, এটি ব্যবহার করা সহজ, এবং এটি আমার প্রোড ইনভের জন্য ভাল কাজ করে। stackoverflow.com/questions/21271468/...
Forest10

59

যেমনটি উল্লেখ করা হয়েছিল যে @PropertySourceইয়ামল ফাইল লোড করে না। একটি workaround হিসাবে আপনার নিজের উপর ফাইল লোড করুন এবং এতে বোঝা বৈশিষ্ট্য যুক্ত করুন Environment

বাস্তবায়ন ApplicationContextInitializer:

public class YamlFileApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
  @Override
  public void initialize(ConfigurableApplicationContext applicationContext) {
    try {
        Resource resource = applicationContext.getResource("classpath:file.yml");
        YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader();
        PropertySource<?> yamlTestProperties = sourceLoader.load("yamlTestProperties", resource, null);
        applicationContext.getEnvironment().getPropertySources().addFirst(yamlTestProperties);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
  }
}

আপনার পরীক্ষায় আপনার ইনিশিয়ালাইজার যুক্ত করুন:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class, initializers = YamlFileApplicationContextInitializer.class)
public class SimpleTest {
  @Test
  public test(){
    // test your properties
  }
}

আসলে এটি সর্বোত্তম উত্তর হওয়া উচিত, ধন্যবাদ এটি কাজ করেছে!
আদেলিন

ম্যাটিউজ, আমি YamlFileApplicationContextInitializerক্লাসের সাথে উত্তর পোস্ট করেছি যেখানে পরীক্ষার ক্ষেত্রে ওয়াইএএমএল অবস্থানের সংজ্ঞা দেওয়া আছে। যদি আপনি এটি আকর্ষণীয় বলে মনে করেন তবে এটিকে আপনার উত্তরের সাথে সংযুক্ত করতে নির্দ্বিধায় এবং আমি আমারটিকে মুছে ফেলব। আমার উত্তরটি প্রশমিত করার জন্য কেবল একটি মন্তব্যে আমাকে জানান।
মিশাল ফোকসা

হ্যাঁ, এটি সেরা উত্তর
রিচার্ড এইচএম

34

@PropertySourcefactoryযুক্তি দ্বারা কনফিগার করা যেতে পারে । সুতরাং আপনি যেমন কিছু করতে পারেন:

@PropertySource(value = "classpath:application-test.yml", factory = YamlPropertyLoaderFactory.class)

YamlPropertyLoaderFactoryআপনার কাস্টম সম্পত্তি লোডার কোথায় :

public class YamlPropertyLoaderFactory extends DefaultPropertySourceFactory {
    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        if (resource == null){
            return super.createPropertySource(name, resource);
        }

        return new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource(), null);
    }
}

Https://stackoverflow.com/a/45882447/4527110 দ্বারা অনুপ্রাণিত


2
এই অন্তর্নিহিত ইয়ামল পার্স একটি নিক্ষেপ করে IllegalStateExceptionযখন ফাইলটি যথাযথের পরিবর্তে উপস্থিত না থাকে FileNotFoundException- সুতরাং এই কাজটি করার জন্য আপনাকে এই কেসটি @PropertySource(..., ignoreResourceNotFound = true)ধরতে হবে এবং পরিচালনা করতে হবে: try { return new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource(), null); } catch (IllegalStateException e) { throw (IOException) e.getCause(); }
খ্রিস্টান

2
আপনার যদি নির্দিষ্ট প্রোফাইলের জন্য বৈশিষ্ট্য পেতে হয় তবে ইয়ামলপ্রপার্টিসোর্সলোডার.লোড () এর তৃতীয় পরামিতিটি প্রোফাইল নাম। YamlPropertySourceLoader.load () একটি একক প্রোপারটাইসোর্সের পরিবর্তে একটি তালিকা ফেরত পরিবর্তন করেছে। এখানে এর আরো তথ্য stackoverflow.com/a/53697551/10668441
pcoates

1
এটি এখন পর্যন্ত সবচেয়ে পরিষ্কার পদ্ধতির।
মিশাল ফোকসা

7
আমার জন্য, এর পরিবর্তে এটিতে কিছুটা পরিবর্তন প্রয়োজন:CompositePropertySource propertySource = new CompositePropertySource(name); new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()).stream().forEach(propertySource::addPropertySource); return propertySource;
xorcus

28

@PropertySourceকেবলমাত্র বৈশিষ্ট্য ফাইলগুলিকে সমর্থন করে (এটি স্প্রিংয়ের একটি সীমাবদ্ধতা, নিজেই বুট নয়)। JIRA এ কোনও বৈশিষ্ট্যের অনুরোধের টিকিটটি নির্দ্বিধায় খোলেন ।


আমি আশা করছিলাম যে ইয়ামল শ্রোতার পুনরায় ব্যবহার করার উপায় বা ম্যানুয়ালি কোনও পরিবেশে যমল লোড করার কোনও উপায় ছিল যা পরীক্ষার কনফিগারেশনে উত্তীর্ণ হতে পারে।
চেকলেটগুলি

10
আমি মনে করি আপনি একটি লিখতে ApplicationContextInitializerএবং এটি পরীক্ষার কনফিগারেশনে যুক্ত করতে পারেন (কেবলমাত্র YamlPropertySourceLoaderউন্নত করতে একটি ব্যবহার করুন Environment)। ব্যক্তিগতভাবে আমি এটিকে পছন্দ করব যদি @PropertySourceএই আচরণটি স্থানীয়ভাবে সমর্থন করে support
ডেভ সায়ার

এটা কি এখনও আছে? '@ প্রপার্টিসোর্স' কি ওয়াইএএমএল সমর্থন করে না?
domi

1
stackoverflow.com/questions/21271468/... এই সমাধান করতে পারে @PropertySource শুধুমাত্র বৈশিষ্ট্য ফাইল সমর্থন ব্যবহার
Forest10

আমি 6 বছরের পুরানো পোস্টটি দিয়ে আমার সমস্যার সমাধান করে দিয়েছি।
জিন কোওন

20

আর একটি বিকল্প spring.config.locationমাধ্যমে সেট করা হয় @TestPropertySource:

@TestPropertySource(properties = { "spring.config.location = classpath:<path-to-your-yml-file>" }

3
আমি নিম্নলিখিত লাইনটি দিয়ে ইনপুটকে প্যারাম্যাট্রাইজ করেছি: @TestPropertySource(properties = {"spring.config.location=classpath:application-${test.env}.yml" }) আইএমও আপনার মধ্যে সর্বোত্তম উত্তর।
লেভেনটুভার

1
দুর্দান্ত ধারণা এবং পরীক্ষাগুলির জন্য খুব নমনীয়, অনেক অনেক ধন্যবাদ! কেবল যোগ করতে, প্রতি একাধিক কনফিগারেশন ফাইল অন্তর্ভুক্ত থাকতে পারে:@TestPropertySource(properties = {"spring.config.location=classpath:application-config.yml,classpath:test-config.yml,..." })
stx

1
এটি এখন পর্যন্ত সেরা উত্তর! নোট করুন যে আপনার @SpringBootTestটিকা আছে
মিস্ট্রিয়েল

এটি ম্যাজিকালি কাজ করে!
ব্যবহারকারী 1079877

19

স্প্রিং বুট 1.4 থেকে, আপনি @SpringBootTestস্প্রিং বুট সমর্থন ব্যবহার করে আপনার ইন্টিগ্রেশন পরীক্ষার বুটস্ট্র্যাপ করে আরও সহজে এটি অর্জন করতে (এবং সাধারণভাবে আপনার ইন্টিগ্রেশন টেস্ট সেটআপটিকে সহজ করার জন্য) নতুন টিকাটি ব্যবহার করতে পারেন ।

স্প্রিং ব্লগে বিশদ ।

আমি যতদূর বলতে পারি, এর অর্থ আপনি ক্লাসপথ থেকে স্বয়ংক্রিয়ভাবে ওয়াইএএমএল কনফিগারেশন বাছাই সহ আপনার উত্পাদন কোডের মতো স্প্রিং বুটের বহিরাগত কনফিগারেশনের সদ্ব্যবহার পাবেন

ডিফল্টরূপে, এই টীকাটি হবে

... প্রথম @Configurationকোনও অভ্যন্তরীণ-শ্রেণি থেকে লোড করার চেষ্টা করুন এবং যদি এটি ব্যর্থ হয় তবে এটি আপনার প্রাথমিক @SpringBootApplicationশ্রেণীর সন্ধান করবে ।

তবে প্রয়োজনে আপনি অন্যান্য কনফিগারেশন ক্লাস নির্দিষ্ট করতে পারেন।

এই বিশেষ ক্ষেত্রে, যদি আপনি একত্রিত করতে পারেন @SpringBootTestসঙ্গে @ActiveProfiles( "test" ), এটাই কি স্বাভাবিক বুট নামকরণ মান (যেমন অনুসরণ করে দেওয়া হয় না এবং স্প্রিং আপনার YAML কনফিগ তুলে নেব application-test.yml)।

@RunWith( SpringRunner.class )
@SpringBootTest
@ActiveProfiles( "test" )
public class SpringBootITest {

    @Value("${db.username}")
    private String username;

    @Autowired
    private MyBean myBean;

    ...

}

দ্রষ্টব্য: এর SpringRunner.classজন্য নতুন নামSpringJUnit4ClassRunner.class


1
:) কেবলমাত্র অ্যাক্টিভপ্রোফিল ব্যবহার করা সেই বিকল্প হিসাবে কাজ করে। ধন্যবাদ!
zcourts

10

ইয়ামাল বৈশিষ্ট্যগুলি লোড করার পদ্ধতির, আইএমএইচও দুটি উপায়ে করা যেতে পারে:

ক। ক্লাসপথের application.ymlমূলের মধ্যে - আপনি একটি সাধারণ স্থানে কনফিগারেশনটি রাখতে পারেন - সাধারণত src/main/resourcesএবং এই ইয়ামাল বৈশিষ্ট্যটি আপনি উল্লেখ করেছেন এমন সমতল পথের নাম দিয়ে স্বয়ংক্রিয়ভাবে স্প্রিং বুটে লোড হওয়া উচিত।

খ। দ্বিতীয় পদ্ধতিরটি আরও কিছুটা বিস্তৃত, মূলত এইভাবে আপনার সম্পত্তিগুলি ধরে রাখার জন্য একটি শ্রেণীর সংজ্ঞা দিন:

@ConfigurationProperties(path="classpath:/appprops.yml", name="db")
public class DbProperties {
    private String url;
    private String username;
    private String password;
...
}

সুতরাং মূলত এটি বলছে যে ইয়ামল ফাইলটি লোড করুন এবং "ডিবি" এর মূল উপাদানটির উপর ভিত্তি করে ডিবিপ্রপার্টি ক্লাসটি তৈরি করুন।

এখন এটি কোনও ক্লাসে ব্যবহার করতে আপনাকে এটি করতে হবে:

@EnableConfigurationProperties(DbProperties.class)
public class PropertiesUsingService {

    @Autowired private DbProperties dbProperties;

}

এই পদ্ধতির কোনওটিই আপনার জন্য স্প্রিং-বুট ব্যবহার করে পরিষ্কারভাবে কাজ করা উচিত।


আপনার ক্লাসপথে স্নাপমিল রয়েছে এবং উপরের কাজ করা উচিত তা নিশ্চিত করুন।
হোসারডুড

3
এই দিনগুলিতে (যদিও এই প্রশ্নটি জিজ্ঞাসা করার সময়ে নয়) snakeyamlএটিকে একটি ট্রানজিটিভ নির্ভরতা হিসাবে টেনে তোলা হয় spring-boot-starter, সুতরাং আপনার pom.xmlবা build.gradleঅন্য সংস্করণ ব্যবহার করার গভীর গভীর উদ্দীপনা না থাকলে এটিকে আপনার বা যুক্ত করার দরকার নেই । :)
স্টিভ

2
এটি এখন locations, না path, এবং ConfigFileApplicationContextInitializerএটিও প্রয়োজনীয়।
অরেঞ্জডগ

3

@ActiveProfiles("test")অ্যাপ্লিকেশন-টেস্ট.আইএমএল ফাইলটি এসসিআর / টেস্ট / সংস্থানগুলিতে ব্যবহার করে এবং যুক্ত করে আমি একটি কার্যপ্রণালী পেয়েছি।

এটি এর মতো দেখতে শেষ হয়েছিল:

@SpringApplicationConfiguration(classes = Application.class, initializers = ConfigFileApplicationContextInitializer.class)
@ActiveProfiles("test")
public abstract class AbstractIntegrationTest extends AbstractTransactionalJUnit4SpringContextTests {

}

ফাইল-অ্যাপ্লিকেশন-টেস্ট.আইএমএল-এ কেবল সেই বৈশিষ্ট্য রয়েছে যা আমি অ্যাপ্লিকেশন.আইএমএল থেকে ওভাররাইড করতে চাই (যা এসসিআর / প্রধান / সংস্থানগুলিতে পাওয়া যেতে পারে)।


এটি আমি পাশাপাশি ব্যবহার করার চেষ্টা করছিলাম। কোনও কারণে এটি কাজ করে না (স্প্রিং বুট ১.৩.৩) আমি যখন ব্যবহার করি @Value("${my.property}")তবে এটি ব্যবহার করা ভাল কাজ করে environment.getProperty("my.property")
মার্টিন-জি

1

এটি কারণ আপনি স্নাপমিল কনফিগার করেন নি। @EnableAutoConfigration বৈশিষ্ট্য সহ স্প্রিং বুট আসে। আপনি এই টিকাটি কল করার সময় স্নাপমিল কনফিগারেশন রয়েছে ..

এটা আমার পথ:

@Configuration
@EnableAutoConfiguration
public class AppContextTest {
}

এখানে আমার পরীক্ষা:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(
        classes = {
                AppContextTest.class,
                JaxbConfiguration.class,
        }
)

public class JaxbTest {
//tests are ommited
}

0

আমার কোডে আমার কয়েকটি বৈশিষ্ট্য পড়ার দরকার ছিল এবং এটি স্প্রিং-বুট ১.৩.০. এর সাথে কাজ করে

@Autowired
private ConfigurableListableBeanFactory beanFactory;

// access a properties.yml file like properties
@Bean
public PropertySource properties() {
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
    yaml.setResources(new ClassPathResource("properties.yml"));
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
    // properties need to be processed by beanfactory to be accessible after
    propertySourcesPlaceholderConfigurer.postProcessBeanFactory(beanFactory);
    return propertySourcesPlaceholderConfigurer.getAppliedPropertySources().get(PropertySourcesPlaceholderConfigurer.LOCAL_PROPERTIES_PROPERTY_SOURCE_NAME);
}

0

স্প্রিং বুটে একাধিক প্রোফাইল কনফিগারেশন সহ কাস্টম yML ফাইল লোড হচ্ছে।

1) স্প্রিংবুট অ্যাপ্লিকেশন শুরু হিসাবে সম্পত্তি শিম যোগ করুন

@SpringBootApplication
@ComponentScan({"com.example.as.*"})
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

    @Bean
    @Profile("dev")
    public PropertySourcesPlaceholderConfigurer propertiesStage() {
        return properties("dev");
    }

    @Bean
    @Profile("stage")
    public PropertySourcesPlaceholderConfigurer propertiesDev() {
        return properties("stage");
    }

    @Bean
    @Profile("default")
    public PropertySourcesPlaceholderConfigurer propertiesDefault() {
        return properties("default");

    }
   /**
    * Update custom specific yml file with profile configuration.
    * @param profile
    * @return
    */
    public static PropertySourcesPlaceholderConfigurer properties(String profile) {
       PropertySourcesPlaceholderConfigurer propertyConfig = null;
       YamlPropertiesFactoryBean yaml  = null;

       propertyConfig  = new PropertySourcesPlaceholderConfigurer();
       yaml = new YamlPropertiesFactoryBean();
       yaml.setDocumentMatchers(new SpringProfileDocumentMatcher(profile));// load profile filter.
       yaml.setResources(new ClassPathResource("env_config/test-service-config.yml"));
       propertyConfig.setProperties(yaml.getObject());
       return propertyConfig;
    }
}

2) নীচে জাভা পোজো অবজেক্টটি কনফিগার করুন

@Component
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
@ConfigurationProperties(prefix = "test-service")
public class TestConfig {

    @JsonProperty("id") 
    private  String id;

    @JsonProperty("name")
    private String name;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }   

}

3) কাস্টম yML তৈরি করুন (এবং এটি নীচে হিসাবে রিসোর্স পাথের নীচে রাখুন, ওয়াইএমএল ফাইলের নাম: পরীক্ষা-পরিষেবা-কনফিগারেশন.আইএমএল

YML ফাইলে যেমন কনফিগার করুন।

test-service: 
    id: default_id
    name: Default application config
---
spring:
  profiles: dev

test-service: 
  id: dev_id
  name: dev application config

--- 
spring:
  profiles: stage

test-service: 
  id: stage_id
  name: stage application config

0

আমি একটি বিশেষ পরিস্থিতিতে ছিলাম যেখানে কাস্টম ফাইল সম্পত্তি নামকরণের কারণে আমি @ কনফিগারেশনপ্রোপার্টি ক্লাস লোড করতে পারিনি। শেষে কেবলমাত্র কাজটি হ'ল (ধন্যবাদ @ ম্যাটিউজ বাল্বাস):

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {MyTest.ContextConfiguration.class})
public class MyTest {

    @TestConfiguration
    public static class ContextConfiguration {

        @Autowired
        ApplicationContext applicationContext;

        @Bean
        public ConfigurationPropertiesBean myConfigurationPropertiesBean() throws IOException {
            Resource resource = applicationContext.getResource("classpath:my-properties-file.yml");

            YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader();
            List<PropertySource<?>> loadedSources = sourceLoader.load("yamlTestProperties", resource);
            PropertySource<?> yamlTestProperties = loadedSources.get(0);
            ConfigurableEnvironment configurableEnvironment = (ConfigurableEnvironment)applicationContext.getEnvironment();
            configurableEnvironment.getPropertySources().addFirst(yamlTestProperties);

            Binder binder = Binder.get(applicationContext.getEnvironment());
            ConfigurationPropertiesBean configurationPropertiesBean = binder.bind("my-properties-file-prefix", Bindable.of(ConfigurationPropertiesBean.class)).get();
            return configurationPropertiesBean;
        }

    }

    @Autowired
    ConfigurationPropertiesBean configurationPropertiesBean;

    @Test
    public void test() {

        configurationPropertiesBean.getMyProperty();

    }

}

0
<dependency>
  <groupId>com.github.yingzhuo</groupId>
  <artifactId>spring-boot-stater-env</artifactId>
  <version>0.0.3</version>
</dependency>

আমার লাইব্রেরি ব্যবহার করতে স্বাগতম। এখন ইয়ামল , টমল , হোকন সমর্থিত।

সূত্র: github.com


0

এটি মূল প্রশ্নের উত্তর নয়, তবে পরীক্ষায় আলাদা কনফিগারেশন করার প্রয়োজনের বিকল্প সমাধান ...

পরিবর্তে @PropertySourceআপনি ব্যবহার করতে পারেন -Dspring.config.additional-location=classpath:application-tests.yml

সচেতন হন, প্রত্যয়টির testsঅর্থ প্রোফাইল নয় ...

যে কোনও একটি ওয়াইএমএল ফাইলে একাধিক প্রোফাইল নির্দিষ্ট করা যায়, যা একে অপরের কাছ থেকে উত্তরাধিকারী হতে পারে, আরও পড়ুন এখানে - একাধিক স্প্রিং প্রোফাইলের জন্য সম্পত্তি সমাধান (ইয়ামাল কনফিগারেশন)

তারপর আপনি আপনার পরীক্ষা নির্দিষ্ট করতে পারেন, যে সক্রিয় প্রোফাইলের (ব্যবহার @ActiveProfiles("profile1,profile2")) হয় profile1,profile2যেখানে profile2কেবল ওভাররাইড করবে বৈশিষ্ট্য থেকে (কিছু, এক সব ওভাররাইড করার দরকার নেই) profile1


0

আমি তালিকাভুক্ত সমস্ত প্রশ্নের চেষ্টা করেছি, তবে সেগুলি সবই আমার কাজের জন্য কার্যকর নয়: কিছু ইউনিট পরীক্ষার জন্য নির্দিষ্ট ইয়ামল ফাইল ব্যবহার করে। আমার ক্ষেত্রে এটি কাজ করে:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = {ConfigFileApplicationContextInitializer.class})
@TestPropertySource(properties = {"spring.config.location=file:../path/to/specific/config/application.yml"})
public class SomeTest {


    @Value("${my.property.value:#{null}}")
    private String value;

    @Test
    public void test() {
        System.out.println("value = " + value);
    }

}

-6

YamlPropertyLoaderFactory বা YamlFileApplicationContextInialializer এর মতো যুক্ত করার দরকার নেই। আপনার নিজের ধারণাটি রূপান্তর করা উচিত। ঠিক সাধারণ বসন্ত প্রকল্পের মতো। আপনি জানেন, জাভা কনফিগারেশন ব্যবহার করছেন না। শুধু * .xML

এই পদক্ষেপগুলি অনুসরণ করুন:

শুধু প্রয়োগকন্টেক্সটেক্স.এমএমএল যুক্ত করুন

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
       default-autowire="byName">

    <context:property-placeholder location="classpath*:*.yml"/>
</beans>

তারপর যোগ

@ImportResource({"classpath:applicationContext.xml"})

আপনার ApplicationMainClass

এটি আপনার অ্যাপ্লিকেশন-টেস্ট.আইএমএল স্ক্যান করতে সহায়তা করতে পারে

db:
  url: jdbc:oracle:thin:@pathToMyDb
  username: someUser
  password: fakePassword

প্রশ্ন ইয়ামল (যা আইএমএইচও একটি ভাল কনফিগারেশন পদ্ধতি) এর সাথে সম্পর্কিত ছিল
aldebaran-ms
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.