স্প্রিং বুট অ্যাপ্লিকেশন rop


97

আমার কাছে খুব সহজ স্প্রিং বুট অ্যাপ রয়েছে যা আমি কিছু বাহ্যিক কনফিগারেশন নিয়ে কাজ করার চেষ্টা করছি। আমি স্প্রিং বুট ডকুমেন্টেশনের তথ্য অনুসরণ করার চেষ্টা করেছি তবে আমি একটি রোড ব্লক মারছি।

আমি যখন অ্যাপ্লিকেশনটি বাহ্যিক কনফিগারেশনের নীচে অ্যাপ্লিকেশনটিতে চালিত করি rop আমি নিশ্চিত যে আমি বোকা কিছু করছি, কোনও পরামর্শের জন্য ধন্যবাদ।

মাইবিয়ান.জভা (/ এসআরসি / মেইন / জাভা / ফু / বার / এ অবস্থিত)

package foo.bar;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

    @Value("${some.prop}")
    private String prop;

    public MyBean() {
        System.out.println("================== " + prop + "================== ");
    }
}

অ্যাপ্লিকেশন.জভা (/ এসসিআর / প্রধান / জাভা / ফু / এ অবস্থিত)

package foo;

import foo.bar.MyBean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    @Autowired
    private MyBean myBean;

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

application.properties (/ src / প্রধান / সংস্থানসমূহে অবস্থিত)

some.prop=aabbcc

স্প্রিং বুট অ্যাপ্লিকেশনটি কার্যকর করার সময় লগ আউটপুট :

grb-macbook-pro:properties-test-app grahamrb$ java -jar ./build/libs/properties-test-app-0.1.0.jar

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.1.5.RELEASE)

2014-09-10 21:28:42.149  INFO 16554 --- [           main] foo.Application                          : Starting Application on grb-macbook-pro.local with PID 16554 (/Users/grahamrb/Dropbox/dev-projects/spring-apps/properties-test-app/build/libs/properties-test-app-0.1.0.jar started by grahamrb in /Users/grahamrb/Dropbox/dev-projects/spring-apps/properties-test-app)
2014-09-10 21:28:42.196  INFO 16554 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@67e38ec8: startup date [Wed Sep 10 21:28:42 EST 2014]; root of context hierarchy
2014-09-10 21:28:42.828  INFO 16554 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2014-09-10 21:28:43.592  INFO 16554 --- [           main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080
2014-09-10 21:28:43.784  INFO 16554 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2014-09-10 21:28:43.785  INFO 16554 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.54
2014-09-10 21:28:43.889  INFO 16554 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2014-09-10 21:28:43.889  INFO 16554 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1695 ms
2014-09-10 21:28:44.391  INFO 16554 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2014-09-10 21:28:44.393  INFO 16554 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
================== null==================
2014-09-10 21:28:44.606  INFO 16554 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-09-10 21:28:44.679  INFO 16554 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2014-09-10 21:28:44.679  INFO 16554 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],methods=[],params=[],headers=[],consumes=[],produces=[text/html],custom=[]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest)
2014-09-10 21:28:44.716  INFO 16554 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-09-10 21:28:44.716  INFO 16554 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2014-09-10 21:28:44.902  INFO 16554 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2014-09-10 21:28:44.963  INFO 16554 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080/http
2014-09-10 21:28:44.965  INFO 16554 --- [           main] foo.Application                          : Started Application in 3.316 seconds (JVM running for 3.822)
^C2014-09-10 21:28:54.223  INFO 16554 --- [       Thread-2] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@67e38ec8: startup date [Wed Sep 10 21:28:42 EST 2014]; root of context hierarchy
2014-09-10 21:28:54.225  INFO 16554 --- [       Thread-2] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

4
এবং @Valueসিম তৈরির আগে কীভাবে প্রতিস্থাপন করা উচিত ? মানটি সেট করা থাকলে আপনার "সনাক্তকরণের" উপায়টি ভুল। এই মুহুর্তে এটি সর্বদা শূন্য @Valueহবে যেমন অবজেক্ট নির্মাণের পরে প্রক্রিয়া করা হবে।
এম। ডিনুম

উত্তর:


165

আপনি যেভাবে সম্পত্তিটির ইনজেকশনটি চালিয়ে যাচ্ছেন তা কার্যকর হবে না, কারণ ইনজেকশনটি কনস্ট্রাক্টর ডেকে যাওয়ার পরে করা হয়।

আপনাকে নিম্নলিখিতগুলির একটি করতে হবে:

আরও ভাল সমাধান

@Component
public class MyBean {

    private final String prop;

    @Autowired
    public MyBean(@Value("${some.prop}") String prop) {
        this.prop = prop;
        System.out.println("================== " + prop + "================== ");
    }
}

সমাধান যা কাজ করবে তবে কম পরীক্ষামূলক এবং সামান্য কম পঠনযোগ্য

@Component
public class MyBean {

    @Value("${some.prop}")
    private String prop;

    public MyBean() {

    }

    @PostConstruct
    public void init() {
        System.out.println("================== " + prop + "================== ");
    }
}

এছাড়াও লক্ষ করুন যে স্প্রিং বুট নির্দিষ্ট নয় তবে যে কোনও স্প্রিং অ্যাপ্লিকেশনে প্রযোজ্য


এটির কাজটি করার জন্য আমাকে কনস্ট্রাক্টরে একটি @ অটোভায়ার্ড টিকা যুক্ত করতে হয়েছিল
ট্রাম্প

4
টিপ জন্য ধন্যবাদ. এটি স্প্রিং ডকুমেন্টেশনে হওয়া উচিত যেখানে এটি @ ভ্যালু টীকাগুলির বিষয়ে কথা বলে - তবে এই ছেলেরা তাদের ডকুমেন্টেশনে প্রতিক্রিয়া জানাতে আগ্রহী বলে মনে হয় না :(
অ্যালেক্স ওয়ার্ডেন

4
আমাকে কিছুটা বাঁচিয়েছে ধন্যবাদ!
রবার্ট মোসকাল

4
@ জিয়োন্ড এবং যদি আপনার 10 টিরও বেশি মান থাকে তবে আপনি যেভাবে 10 টির চেয়ে বেশি 10 টাইপ করতে হবে? বা কোনও পরিষ্কার উপায় আছে
জেসি

4
@ জ্যাকি সত্যিই একটি পরিষ্কার উপায় আছে! দেখুন @ConfigurationPropertiesএবং @EnableConfigurationPropertiesটীকাগুলি
জিওএন্ড

5

ব্যবহারকারী "জিওয়ান্ড" এখানে কারণগুলি উল্লেখ করে এবং সমাধান দেওয়ার ক্ষেত্রে সঠিক। তবে আরও ভাল পন্থা হ'ল আপনার কনফিগারেশনকে একটি পৃথক শ্রেণিতে আবদ্ধ করা, সিস্টেমকন্টিগ্রেশন জাভা ক্লাস বলুন এবং তারপরে আপনি এই ক্ষেত্রগুলি ব্যবহার করতে চান এমন পরিষেবাগুলিতে এই শ্রেণিকে ইনজেক্ট করুন।

কনফিগার মানগুলি সরাসরি পরিষেবাগুলিতে পড়ার আপনার বর্তমান পদ্ধতি (@ গ্রাহামআরবি) ত্রুটি প্রবণ এবং যদি কনফিগারেশন সেটিংসের নাম পরিবর্তন করা হয় তবে রিফ্যাক্টরিং মাথাব্যথার কারণ হতে পারে।


আপনার যদি সেই সম্পত্তির জন্য পৃথক শ্রেণি থাকে তবে কীভাবে কোনও কম মাথা ব্যথা হবে না? আপনার কাছে এখনও একটি স্ট্রিং থাকবে যা রিফ্যাক্ট করার সময় মনে রাখা দরকার
dot_Sp0T

4
আপনার কেবলমাত্র "স্মরণ" রাখতে হবে এমন একটি জায়গা রয়েছে যা এন নম্বর নয়। সিস্টেমকন্টিগ্রেশনটিতে থাকা স্কেলারের মানগুলি আপনাকে দৃ strong় টাইপ দেয়। এছাড়াও, যদি এমন কোনও ব্যবসায়িক যুক্তি থাকে যা "কাঁটাচামচ" রয়েছে the কনফিগারেশন থেকে আগত মানগুলির উপর ভিত্তি করে ~~~ ..... মান / শ্রেণীর / লজিকের জন্য মানগুলির প্রয়োজন এমন কোনও কিছু ইনজেক্ট করা ভাল। তবে, সিস্টেমকন্টিগ্রেশনটিকে উপহাস করা আরও সহজ, তারপরে @ ভ্যালুকে জায়গা জুড়ে কাজ করার চেষ্টা করা।
গ্রানাডা কোডার

3

আসলে, আমার জন্য নীচে ভাল কাজ করে।

@Component
public class MyBean {

   public static String prop;

   @Value("${some.prop}")
   public void setProp(String prop) {
      this.prop= prop;
   }

   public MyBean() {

   }

   @PostConstruct
   public void init() {
      System.out.println("================== " + prop + "================== ");
   }

}

এখন আমি যেখানেই চাই, কেবল প্রার্থনা কর

MyBean.prop

এটি মান ফিরে আসবে।


2

এই উত্তরটি আপনার ক্ষেত্রে প্রযোজ্য বা নাও হতে পারে ... একবার যদি আমার একইরকম লক্ষণ দেখা গিয়েছিল এবং আমি আমার কোডটি বহুবার ডাবল চেক করেছিলাম এবং সব ভাল লাগছিল তবে @Valueসেটিংস এখনও কার্যকর হচ্ছে না। এবং তারপরে File > Invalidate Cache / Restartআমার IntelliJ(আমার আইডিই) সাথে কাজ করার পরে সমস্যাটি চলে গেল ...

এটি চেষ্টা করা খুব সহজ তাই কোনও শটের জন্য মূল্য হতে পারে


1

পরিবেশ ক্লাস ব্যবহার করে আমরা আবেদন পেতে পারি। বৈশিষ্ট্য মান

@ আউটওয়ার্ড,

private Environment env;

এবং ব্যবহার অ্যাক্সেস

String password =env.getProperty(your property key);

0

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

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("${some.pro}")
    private String somePro;

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

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

@Component
public class YourService {

    @Autowired
    private String getsomePro;

    // now you have a value in getsomePro variable automatically.
}

0

যদি আপনি বেশ কয়েকটি বিভিন্ন application.propertiesফাইল সহ একটি বৃহত মাল্টি-মডিউল প্রকল্পে কাজ করছেন তবে পিতামাতার প্রকল্পের সম্পত্তি ফাইলটিতে আপনার মান যুক্ত করার চেষ্টা করুন।

আপনি যদি নিশ্চিত না হন তবে কোনটি আপনার মূল প্রকল্প, pom.xmlকোনও <parent>ট্যাগের জন্য আপনার প্রকল্পের ফাইলটি পরীক্ষা করুন ।

এটি আমার জন্য সমস্যাটি সমাধান করেছে।


0

আপনি Environmentডেটা পেতে ক্লাস ব্যবহার করতে পারেন :

@Autowired
private Environment env;
String prop= env.getProperty('some.prop');
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.