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


109

শুরু করার সময় স্প্রিং বুট অ্যাপ্লিকেশন চালানোর সময় আমি ব্যতিক্রমের নীচে পাচ্ছি:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.web.client.RestTemplate com.micro.test.controller.TestController.restTemplate; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.web.client.RestTemplate] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

আমি আমার টেস্টকন্ট্রোলারে রেস্টটেম্পলেটটি স্বাবলম্বী করছি। আমি ম্যাভেনকে নির্ভরতা পরিচালনার জন্য ব্যবহার করছি।

TestMicroServiceApplication.java

package com.micro.test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestMicroServiceApplication {

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

TestController.java

    package com.micro.test.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class TestController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value="/micro/order/{id}",
        method=RequestMethod.GET,
        produces=MediaType.ALL_VALUE)
    public String placeOrder(@PathVariable("id") int customerId){

        System.out.println("Hit ===> PlaceOrder");

        Object[] customerJson = restTemplate.getForObject("http://localhost:8080/micro/customers", Object[].class);

        System.out.println(customerJson.toString());

        return "false";
    }

}

POM.xml

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.micro.test</groupId>
    <artifactId>Test-MicroService</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>Test-MicroService</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

1
আপনার প্রশ্নের কারণটিকে সমর্থন করা এটা সুস্পষ্ট নয় যে যখন সবকিছু যাদুতে লিঙ্কযুক্ত থাকে তখন RestTemplateস্বয়ংক্রিয়ভাবে আপনার জন্য তৈরি হয় না।
daniel.eichten

আপভোটেড - স্প্রিং বুটের নিজস্ব পৃষ্ঠায় টিউটোরিয়াল একটি রেস্টটেম্পলেট বিন তৈরির বিষয়ে কিছুই বলে না !!
ম্যাট

উত্তর:


174

ত্রুটিটি ঠিক তাই বলে। আপনি কোনও RestTemplateশিম তৈরি করেননি , সুতরাং এটি কোনওরও স্বায়ত্তশাসন করতে পারে না। আপনার যদি প্রয়োজন হয় তবে আপনাকে একটি সরবরাহ RestTemplateকরতে হবে। উদাহরণস্বরূপ, টেস্টমাইক্রো সার্ভিস অ্যাপ্লিকেশন.জভাতে নিম্নলিখিতগুলি যুক্ত করুন :

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

দ্রষ্টব্য, ইউরেকার জন্য স্প্রিং ক্লাউড স্টার্টারের আগের সংস্করণগুলিতে আপনার জন্য একটি RestTemplateশিম তৈরি করা হয়েছিল, তবে এটি আর সত্য নয়।


আপনার প্রতিউত্তরের জন্য ধন্যবাদ. এই সাহায্য!
খুজি

19
প্রশ্ন এবং আপনার উত্তরের কারণটিকে উত্সাহিত করেছেন এটি স্পষ্ট নয় যে RestTemplateযখন আপনার জন্য সমস্ত কিছু ম্যাজিকালি তৈরি করা এবং লিঙ্ক করা হয় তখন আপনাকে ম্যানুয়ালি তৈরি করতে হবে। বিশেষত যদি কেউ বসন্ত-মেঘ ব্যবহার করে যা একটি স্বতঃরূপে সরবরাহ করে RestTemplate। ;-)
daniel.eichten

2
সত্যিই, এই কারণেই আমি এই বিষয়টি এখানে ফোরামে রেখেছি। আমি আশা করছিলাম রেস্টটেম্পলেটটি আমার জন্য সংযুক্ত হবে। :-) আমি ইউওরিকা নির্ভরতা পিওএম.এমএমএলে অন্তর্ভুক্ত করার সময় এটি ঠিকঠাক কাজ করছিল। রেস্টস্টেম্পলেট সিমকে সংজ্ঞায়িত না করে এটি দুর্দান্ত কাজ করছিল। ইউরেকার একটি শ্রেণির সম্ভবত এই শিমটি সংজ্ঞায়িত করা যেতে পারে।
খুজি

4
শুধু একটি আপডেট। স্প্রিং বুট থেকে 1.4.0 ইনস্ট্যান্স RestTemplateBuilderপরিচালনা করার জন্য ব্যবহার করা যেতে পারে RestTemplate। উদাহরণস্বরূপ বসন্ত.io
মনসুর

আমি এসবি 1.4.0 এ আপগ্রেড করতে পারি না। আমি এটিটি 1.3.8.RELEASE দিয়ে করতে চাই কিন্তু @ g00glen00b সলিউশনটি আমার পক্ষে কার্যকর হয়নি। আমি spring-cloud-netflixসংস্করণ সহ আর্টিফ্যাকটিডও ব্যবহার করছি 1.1.5.RELEASE। আমার রেস্টটেম্পলেটটি @RestControllerজাভা ক্লাস থেকে কল করা হচ্ছে যা এর @Autowiredজন্য ব্যবহার করে RestTemplate। কেউ দয়া করে সাহায্য করতে পারেন?
জিরোগ্রাভিটি

33

আপনি কোন প্রযুক্তি ব্যবহার করছেন এবং কোন সংস্করণ RestTemplateআপনি আপনার @Configurationশ্রেণিতে কীভাবে সংজ্ঞা দিবেন তা প্রভাবিত করবে তার উপর নির্ভরশীল ।

স্প্রিং> = 4 স্প্রিং বুট ছাড়াই

কেবল একটি সংজ্ঞা দিন @Bean:

@Bean
public RestTemplate restTemplate() {
    return new RestTemplate();
}

স্প্রিং বুট <= 1.3

একটির সংজ্ঞা দেওয়ার দরকার নেই, স্প্রিং বুট স্বয়ংক্রিয়ভাবে আপনার জন্য একটি নির্দিষ্ট করে ines

স্প্রিং বুট> = 1.4

স্প্রিং বুট আর স্বয়ংক্রিয়ভাবে একটি RestTemplateসংজ্ঞা RestTemplateBuilderদেয় না পরিবর্তে এটি আপনাকে তৈরি করা রেস্টস্টেম্পলেটের উপর আরও নিয়ন্ত্রণের অনুমতি দেয়। আপনি এটি তৈরি করতে RestTemplateBuilderআপনার @Beanপদ্ধতিতে একটি যুক্তি হিসাবে ইনজেক্ট করতে পারেন RestTemplate:

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
   // Do any additional configuration here
   return builder.build();
}

এটি আপনার ক্লাসে ব্যবহার করছে

@Autowired
private RestTemplate restTemplate;

উল্লেখ


8

যদি টেস্টরেস্টটেম্পলেটটি আপনার ইউনিট পরীক্ষায় একটি বৈধ বিকল্প হয়, তবে এই ডকুমেন্টেশনটি প্রাসঙ্গিক হতে পারে

http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#boot-features-rest-templates-test-utility

সংক্ষিপ্ত উত্তর: যদি ব্যবহার করা হয়

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)

তাহলে @Autowiredকাজ করবে। যদি ব্যবহার করা হয়

@SpringBootTest(webEnvironment=WebEnvironment.MOCK)

তারপরে এটির মতো একটি টেস্টরেস্ট টেম্পলেট তৈরি করুন

private TestRestTemplate template = new TestRestTemplate();

1

ত্রুটিটি সরাসরি নির্দেশ করে যে RestTemplateশিম প্রসঙ্গে সংজ্ঞায়িত করা হয় না এবং এটি মটরশুটি লোড করতে পারে না।

  1. রেস্টটেম্পলেটটির জন্য একটি শিমের সংজ্ঞা দিন এবং তারপরে এটি ব্যবহার করুন
  2. রেস্ট টেম্পলেটটির একটি নতুন উদাহরণ ব্যবহার করুন

আপনি যদি নিশ্চিত হন যে শিমটি রেস্ট টেম্পলেটটির জন্য সংজ্ঞায়িত করা হয়েছে তবে স্প্রিং বুট অ্যাপ্লিকেশন দ্বারা লোড করা প্রসঙ্গে যে মটরশুটি পাওয়া যায় সেগুলি মুদ্রণ করতে নিম্নলিখিতটি ব্যবহার করুন

ApplicationContext ctx = SpringApplication.run(Application.class, args);
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
    System.out.println(beanName);
}

যদি এতে দেওয়া নাম / প্রকারের সাথে শিম থাকে তবে সমস্ত ভাল। অন্যথায় একটি নতুন শিমের সংজ্ঞা দিন এবং তারপরে এটি ব্যবহার করুন।


1

যেহেতু রেস্টটেম্প্লেট দৃষ্টান্তগুলি ব্যবহার করার আগে প্রায়শই কাস্টমাইজ করা প্রয়োজন, তাই স্প্রিং বুট কোনও একক স্বতঃ-কনফিগার করা রেস্টস্টেম্পেট বিন সরবরাহ করে না।

রেস্ট টেম্পলেটবিল্ডার বিশ্রাম টেম্পলেট বিনটি কনফিগার এবং ইনস্ট্যান্ট করার উপযুক্ত উপায় সরবরাহ করে, উদাহরণস্বরূপ বেসিক লেখক বা ইন্টারসেপ্টরগুলির জন্য।

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
                .basicAuthorization("user", "name") // Optional Basic auth example
                .interceptors(new MyCustomInterceptor()) // Optional Custom interceptors, etc..
                .build();
}


0

দুটি জিনিস নিশ্চিত করুন:

1- @Beanপদ্ধতিটি সহ টীকাটি ব্যবহার করুন ।

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
    return builder.build();
}

2- এই পদ্ধতির সুযোগটি ব্যক্তিগত নয়, জনসাধারণের হওয়া উচিত ।

সম্পূর্ণ উদাহরণ -

@Service
public class MakeHttpsCallImpl implements MakeHttpsCall {

@Autowired
private RestTemplate restTemplate;

@Override
public String makeHttpsCall() {
    return restTemplate.getForObject("https://localhost:8085/onewayssl/v1/test",String.class);
}

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder){
    return builder.build();
}
}

0

সবচেয়ে সহজ উপায় যে আমি নীচে কোড ( রেফারেন্স ) ব্যবহার করতে অনুরূপ কীর্তি অর্জন করতে সক্ষম হয়েছি তবে আমি কন্ট্রোলারগুলিতে ( এসআইএলআইডি নীতিগুলি ) এপিআই কল না করার পরামর্শ দেব suggest এছাড়াও এই পদ্ধতিতে স্বয়ংক্রিয়করণ করা এটির প্রচলিত পদ্ধতির চেয়ে ভাল optim

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class TestController {

    private final RestTemplate restTemplate;


    @Autowired
    public TestController(RestTemplateBuilder builder) {
        this.restTemplate = builder.build();
    }

    @RequestMapping(value="/micro/order/{id}", method= RequestMethod.GET, produces= MediaType.ALL_VALUE)
    public String placeOrder(@PathVariable("id") int customerId){

        System.out.println("Hit ===> PlaceOrder");

        Object[] customerJson = restTemplate.getForObject("http://localhost:8080/micro/customers", Object[].class);

        System.out.println(customerJson.toString());

        return "false";
    }
}

0

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

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class YourConfigClass {


    @Bean
    public RestTemplate restTesmplate() {
        return new RestTemplate();
    }

}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.