স্প্রিং বুটে অ্যাপ্লিকেশন.প্রপার্টি ফাইলে সংজ্ঞায়িত কোনও মান কীভাবে অ্যাক্সেস করবেন


312

আমি প্রদত্ত মানগুলিতে অ্যাক্সেস করতে চাই application.properties, যেমন:

logging.level.org.springframework.web: DEBUG
logging.level.org.hibernate: ERROR
logging.file=${HOME}/application.log

userBucket.path=${HOME}/bucket

আমি userBucket.pathআমার মূল প্রোগ্রামটিতে একটি স্প্রিং বুট অ্যাপ্লিকেশনটিতে অ্যাক্সেস করতে চাই ।

উত্তর:


467

আপনি @Valueটীকাটি ব্যবহার করতে পারেন এবং আপনি যে কোনও বসন্তের শিম ব্যবহার করছেন property

@Value("${userBucket.path}")
private String userBucketPath;

বাহ্যিক কনফিগারেশন স্প্রিং বুট ডক্সের অধ্যায়, সকল বিবরণ আপনি প্রয়োজন হতে পারে ব্যাখ্যা করে।


5
বিকল্প হিসাবে যে Environment@ConfigurationProperties
কোনও এটি

3
@ Sodik এর উত্তর উপরে যোগ করার জন্য, এই একটি উদাহরণ দেখায় কিভাবে পেতে হয় পরিবেশ stackoverflow.com/questions/28392231/...
Cristi

যদি আপনার 10 টিরও বেশি মানগুলিতে অ্যাক্সেসের প্রয়োজন হয় তবে আপনি কি 10 বার আপনার উদাহরণটি পুনরাবৃত্তি করতে থাকবেন?
জেসি

একটি পদ্ধতির এটি করা হবে, কিন্তু এটি জটিল। @Configurationক্লাসের ভিত্তিতে বিকল্প পদ্ধতি রয়েছে, নিম্নলিখিত ব্লগ পোস্টে
মাস্টার স্লেভ

2
দ্রষ্টব্য, এটি কেবলমাত্র @Component(বা এর কোনও ডেরাইভেটিভ, অর্থাত্ @Repositoryপ্রভৃতি)
জানাক মীনা

210

অন্য উপায় org.springframework.core.env.Environmentআপনার শিম ইনজেকশন হয়।

@Autowired
private Environment env;
....

public void method() {
    .....  
    String path = env.getProperty("userBucket.path");
    .....
}

6
আপনি যখন সম্পত্তিটির নাম পরিবর্তনশীল অ্যাক্সেস করতে চান তখন দরকারী
পাওলো মেরসন

3
আপনি যদি সম্পত্তি অনুসন্ধান করতে চান? এবং আমি আমদানি বিবৃতি সহ প্রস্তাব দিতে পারি যাতে সবাই এনভায়রনমেন্ট প্যাকেজটির নাম দেখতে পাবে, সম্ভবত org.springframework.core.env.E পরিবেশ
ক্রিসিনমটাউন

2
ভুল পরিবেশ আমদানি না করার বিষয়ে সতর্ক থাকুন। আমি CORBA পরিবেশটি স্বয়ংক্রিয়ভাবে আমদানি করেছি।
জানাক মীনা

3
কেন আমার vর্ষা নাল?
জানাক মীনা

2
@ জানাকমিণার একই সমস্যা ছিল ইন্টেলিজের অটো আমদানি কর্নবিএর ক্লাসের পরিবর্তেorg.springframework.core.env.Environment
রসু

31

@ConfigurationPropertiesPOJO এর মানগুলি .properties( .ymlএছাড়াও সমর্থিত) থেকে মানচিত্রের জন্য ব্যবহার করা যেতে পারে ।

নিম্নলিখিত উদাহরণ ফাইল বিবেচনা করুন।

.properties

cust.data.employee.name=Sachin
cust.data.employee.dept=Cricket

Employee.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@ConfigurationProperties(prefix = "cust.data.employee")
@Configuration("employeeProperties")
public class Employee {

    private String name;
    private String dept;

    //Getters and Setters go here
}

নীচে স্বতঃসংশ্লিষ্ট দ্বারা বৈশিষ্ট্যের মানটি অ্যাক্সেস employeePropertiesকরা যায়।

@Autowired
private Employee employeeProperties;

public void method() {

   String employeeName = employeeProperties.getName();
   String employeeDept = employeeProperties.getDept();

}

1
আমি এইভাবে ব্যবহার করেছি এবং নাল রিটার্ন পেয়েছি, আমি আমার প্রোপার্টি ফাইলটি এসআরসি / টেস্ট / রিসোর্স এবং প্রোপার্টি জাভা ক্লাসে রেখেছি (যেখানে প্রোপার্টি ভ্যালু সেভ হচ্ছে) এসআরসি / মেইন / প্যাকেজ / প্রোপার্টিগুলিতে রেখেছি। আমি কি মিস করছি? ধন্যবাদ
আহমদ লিও ইয়ুডান্টো

আপনি src/main/resourcesযদি একটি স্প্রিং পরীক্ষা থেকে আপনার কোডটি পরীক্ষা না করে থাকেন তবে আপনাকে ফাইলগুলি সংরক্ষণ করতে হবে।
জোবোন

@ আহমাদলিও ইউদ্যান্তো হিসাবে একই এবং আমি যে পরিবর্তন করতে পারি কিছুই নেই
দিমিত্রি কোপ্রিভা

6

বর্তমানে, আমি নিম্নলিখিত তিনটি উপায় সম্পর্কে জানি:

1. @Valueটিকা

    @Value("${<property.name>}")
    private static final <datatype> PROPERTY_NAME;
  • আমার অভিজ্ঞতায় কিছু পরিস্থিতি রয়েছে যখন আপনি মান পেতে সক্ষম হন না বা সেট হয়ে যায় null। উদাহরণস্বরূপ, আপনি যখন এটি কোনও preConstruct()পদ্ধতি বা কোনও init()পদ্ধতিতে সেট করার চেষ্টা করবেন । ক্লাসটি সম্পূর্ণরূপে নির্মিত হওয়ার পরে মান ইঞ্জেকশনটি ঘটে বলে এটি ঘটে। এ কারণেই 3 য় বিকল্পটি ব্যবহার করা ভাল।

২. @PropertySourceটিকা

<pre>@PropertySource("classpath:application.properties")

//env is an Environment variable
env.getProperty(configKey);</pre>
  • PropertySouceEnvironmentশ্রেণিটি লোড হওয়ার পরে সম্পত্তি উত্স ফাইল থেকে মান (আপনার শ্রেণিতে) সেট করে। সুতরাং আপনি সহজেই অনুসন্ধানের শব্দটি আনতে সক্ষম হন।
    • সিস্টেম এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে অ্যাক্সেসযোগ্য।

৩. @ConfigurationPropertiesটিকা।

  • এটি বেশিরভাগ কনফিগারেশন বৈশিষ্ট্য লোড করতে স্প্রিং প্রকল্পগুলিতে ব্যবহৃত হয়।
  • এটি সম্পত্তি তথ্যের উপর ভিত্তি করে একটি সত্তা সূচনা করে।

    • @ConfigurationProperties সম্পত্তি লোড করতে ফাইল সনাক্ত করে।
    • @Configuration কনফিগারেশন ফাইল ভেরিয়েবলের উপর ভিত্তি করে একটি সিম তৈরি করে।
    @ কনফিগারেশনপ্রাপ্তি (উপসর্গ = "ব্যবহারকারী")
    @Configuration ( "UserData")
    বর্গ ব্যবহারকারী {
      // সম্পত্তি এবং তাদের প্রাপ্ত / সেটর ter
    }
    
    @Autowired
    ব্যক্তিগত ব্যবহারকারী ডেটা ব্যবহারকারী ডেটা;
    
    userData.getPropertyName ();

যদি ডিফল্ট অবস্থানটি ওভাররাইড করা হয় তবে কী হবে spring.config.location? # 2 এখনও কাজ করে?
বময়েটার

এই ক্ষেত্রে, অগ্রাধিকার জায়গায় আসে। আমি জানি যে আপনি কমান্ড লাইনটি ব্যবহার করে বসন্তে.কনফিগ.লোকেশন সেট করবেন তখন এর উচ্চ অগ্রাধিকার রয়েছে তাই এটি বিদ্যমানটিকে ওভাররাইড করে।
ধওয়ানিল প্যাটেল

5

আপনি এটি এইভাবেও করতে পারেন ....

@Component
@PropertySource("classpath:application.properties")
public class ConfigProperties {

    @Autowired
    private Environment env;

    public String getConfigValue(String configKey){
        return env.getProperty(configKey);
    }
}

তারপরে আপনি যেখানেই অ্যাপ্লিকেশন.প্রোপার্টিগুলি পড়তে চান, কেবলমাত্র কনফিগভ্যালু পদ্ধতিতে কীটি পাস করুন।

@Autowired
ConfigProperties configProp;

// Read server.port from app.prop
String portNumber = configProp.getConfigValue("server.port"); 

1
প্যাকেজ কি Environment?
ই তথ্য 128

1
এটি এখানে সন্ধান করুন: org.springframework.core.env.E পরিবেশ
লুসিফার

যদি ডিফল্ট অবস্থানটি ওভাররাইড করা হয় তবে কী হবে spring.config.location?
বম্টুটার

3

আপনি যদি এই মানটি এক জায়গায় ব্যবহার করতে পারেন তবে @Valueআপনি ভেরিয়েবলগুলি লোড করতে ব্যবহার করতে পারেন application.properties, তবে এই ভেরিয়েবলগুলি লোড করার জন্য যদি আপনার আরও কেন্দ্রীভূত উপায়ের প্রয়োজন হয়@ConfigurationProperties পদ্ধতির প্রয়োজন হয় তবে এটি একটি ভাল পদ্ধতির।

আপনার বৈধতা এবং ব্যবসায়িক যুক্তি সম্পাদনের জন্য আপনার যদি বিভিন্ন ডেটা ধরণের প্রয়োজন হয় তবে অতিরিক্তভাবে আপনি ভেরিয়েবলগুলি লোড করতে এবং এটিকে স্বয়ংক্রিয়ভাবে কাস্ট করতে পারেন।

application.properties
custom-app.enable-mocks = false

@Value("${custom-app.enable-mocks}")
private boolean enableMocks;

3

এই পদক্ষেপগুলি অনুসরণ করুন. 1: - আপনার কনফিগারেশন ক্লাসটি নীচের মতো দেখতে পারেন যা আপনি দেখতে পারেন create

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.beans.factory.annotation.Value;

@Configuration
public class YourConfiguration{

    // passing the key which you set in application.properties
    @Value("${userBucket.path}")
    private String userBucket;

   // getting the value from that key which you set in application.properties
    @Bean
    public String getUserBucketPath() {
        return userBucket;
    }
}

2: - আপনার যখন একটি কনফিগারেশন ক্লাস থাকে তখন আপনার প্রয়োজনীয় কনফিগারেশন থেকে ভেরিয়েবলটি ইনজেক্ট করুন।

@Component
public class YourService {

    @Autowired
    private String getUserBucketPath;

    // now you have a value in getUserBucketPath varibale automatically.
}

1
1.Injecting a property with the @Value annotation is straightforward:
@Value( "${jdbc.url}" )
private String jdbcUrl;

2. we can obtain the value of a property using the Environment API

@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

1

একটি অ্যাপ্লিকেশন অ্যাপ্লিকেশন.প্রপার্টি ফাইল থেকে 3 ধরণের মান পড়তে পারে।

application.properties


     my.name=kelly

my.dbConnection ={connection_srting:'http://localhost:...',username:'benz',password:'pwd'}

ক্লাস ফাইল

@Value("${my.name}")
private String name;

@Value("#{${my.dbConnection}}")
private Map<String,String> dbValues;

আপনার যদি অ্যাপ্লিকেশন.সম্পাদনে কোনও সম্পত্তি না থাকে তবে আপনি ডিফল্ট মানটি ব্যবহার করতে পারেন

        @Value("${your_name : default value}")
         private String msg; 

0

স্প্রিং-বুট আমাদের বহিরাগত কনফিগারেশনগুলি সরবরাহ করার জন্য বেশ কয়েকটি পদ্ধতি অনুমোদন করে, আপনি সম্পত্তি ফাইলের পরিবর্তে অ্যাপ্লিকেশন.আইএমএল বা ইয়ামল ফাইল ব্যবহার করতে পারেন এবং বিভিন্ন পরিবেশ অনুসারে বিভিন্ন সম্পত্তি ফাইল সেটআপ সরবরাহ করতে পারেন।

আমরা প্রতিটি পরিবেশের জন্য বৈশিষ্ট্যগুলি পৃথক স্প্রিং প্রোফাইলের অধীনে পৃথক yml ফাইলগুলিতে আলাদা করতে পারি dep

java -jar -Drun.profiles=SpringProfileName

কোন বসন্ত প্রোফাইলটি ব্যবহার করতে হবে তা নির্দিষ্ট করতে। দ্রষ্টব্য যে yML ফাইলগুলির মতো হওয়া উচিত

application-{environmentName}.yml

তাদের জন্য স্বয়ংক্রিয়ভাবে বসন্ত বুটে তোলা হবে।

তথ্যসূত্র: https://docs.spring.io/spring-boot/docs/current/references/html/boot-features-ternternal-config.html#boot-features-ternternal-config-profile-specific-properties

অ্যাপ্লিকেশন.আইএমএল বা সম্পত্তি ফাইল থেকে পড়তে:

সবচেয়ে সহজ উপায় সম্পত্তি ফাইল থেকে একটি মান পড়তে বা yml বসন্ত @value annotation.Spring স্বয়ংক্রিয়ভাবে বসন্ত পরিবেশ yml থেকে সব মান লোড ব্যবহার করতে, তাই আমরা সরাসরি মত পরিবেশ থেকে যারা মান ব্যবহার করতে পারেন:

@Component
public class MySampleBean {

@Value("${name}")
private String sampleName;

// ...

}

বা আরও একটি পদ্ধতি যা বসন্তটি দৃ strongly়ভাবে টাইপ করা মটরশুটিগুলি পড়ার জন্য সরবরাহ করে তা হল:

YML

ymca:
    remote-address: 192.168.1.1
    security:
        username: admin

এই এমএমএল পড়ার জন্য পজো সম্পর্কিত:

@ConfigurationProperties("ymca")
public class YmcaProperties {
    private InetAddress remoteAddress;
    private final Security security = new Security();
    public boolean isEnabled() { ... }
    public void setEnabled(boolean enabled) { ... }
    public InetAddress getRemoteAddress() { ... }
    public void setRemoteAddress(InetAddress remoteAddress) { ... }
    public Security getSecurity() { ... }
    public static class Security {
        private String username;
        private String password;
        public String getUsername() { ... }
        public void setUsername(String username) { ... }
        public String getPassword() { ... }
        public void setPassword(String password) { ... }
    }
}

উপরের পদ্ধতিটি yML ফাইলগুলির সাথে ভালভাবে কাজ করে।

তথ্যসূত্র: https://docs.spring.io/spring-boot/docs/current/references/html/boot-features-ternternal-config.html


0

আমার জন্য, উপরের কোনওটিই সরাসরি আমার পক্ষে কাজ করেনি। আমি যা করেছি তা হ'ল:

যোগ করার পরে @ রডরিগো ভিলালবা জায়েস উত্তরটি দিয়ে আমি
implements InitializingBeanক্লাসে যুক্ত হয়েছি
এবং পদ্ধতিটি বাস্তবায়ন করেছি

@Override
public void afterPropertiesSet() {
    String path = env.getProperty("userBucket.path");
}

যাতে দেখতে হবে

import org.springframework.core.env.Environment;
public class xyz implements InitializingBean {

    @Autowired
    private Environment env;
    private String path;

    ....

    @Override
    public void afterPropertiesSet() {
        path = env.getProperty("userBucket.path");
    }

    public void method() {
        System.out.println("Path: " + path);
    }
}

0

সম্পত্তি মান পাওয়ার সর্বোত্তম উপায়গুলি ব্যবহার করা হচ্ছে।

1. মান টীকা ব্যবহার করে

@Value("${property.key}")
private String propertyKeyVariable;

২. এনভায়ারমেন্ট সিম ব্যবহার করা

@Autowired
private Environment env;

public String getValue() {
    return env.getProperty("property.key");
}

public void display(){
  System.out.println("# Value : "+getValue);
}

0

@Valueটীকাগুলি ব্যবহার করা সবচেয়ে ভাল বিষয় এটি স্বয়ংক্রিয়ভাবে আপনার বস্তুর মান নির্ধারণ করবে private Environment en। এটি আপনার কোড হ্রাস করবে এবং আপনার ফাইলগুলি ফিল্টার করা সহজ হবে।


0

দুটি উপায় আছে,

  1. আপনি সরাসরি @Valueআপনার ক্লাসে ব্যবহার করতে পারেন
    @Value("#{'${application yml field name}'}")
    public String ymlField;

অথবা

  1. এটি পরিষ্কার করার জন্য আপনি @Configurationক্লাস পরিষ্কার করতে পারেন যেখানে আপনি আপনার সমস্ত যুক্ত করতে পারেন@value
@Configuration
public class AppConfig {

    @Value("#{'${application yml field name}'}")
    public String ymlField;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.