Rumah > Java > javaTutorial > teks badan

Bagaimana untuk menyelesaikan masalah penyepaduan OpenFeign dengan SpringBoot

PHPz
Lepaskan: 2023-05-22 18:19:06
ke hadapan
919 orang telah melayarinya

Projek ini menyepadukan OpenFegin

Sepadukan kebergantungan OpenFegin

Pertama sekali, izinkan saya memberitahu anda tentang konfigurasi projek versi SpringBoot yang digunakan oleh keseluruhan projek ialah 2.2.6 OpenFegin asli menggunakan 11.0 Kami memperkenalkan OpenFegin dalam pom.xml seperti berikut.

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <skip_maven_deploy>false</skip_maven_deploy>
    <java.version>1.8</java.version>
    <openfegin.version>11.0</openfegin.version>
</properties>
<dependencies>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-core</artifactId>
        <version>${openfegin.version}</version>
    </dependency>

    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-jackson</artifactId>
        <version>${openfegin.version}</version>
    </dependency>
</dependencies>
Salin selepas log masuk

Di sini, saya telah meninggalkan beberapa item konfigurasi lain.

Seterusnya, saya mula menggunakan OpenFegin untuk memanggil perkhidmatan jauh dalam projek saya. Langkah-langkah khusus adalah seperti berikut.

Laksanakan panggilan jauh

Mula-mula, cipta kelas OpenFeignConfig dan konfigurasikan Kontrak yang digunakan oleh OpenFegin secara lalai.

@Configuration
public class OpenFeignConfig {
 @Bean
 public Contract useFeignAnnotations() {
  return new Contract.Default();
 }
}
Salin selepas log masuk

Seterusnya, kami menulis kelas kilang umum untuk mendapatkan klien OpenFeign ini pada asasnya menggunakan HashMap untuk menyimpan semua FeginClient ini pada asasnya antara muka Fegin Kunci dalam cache ialah URL asas sambungan yang diminta, dan Nilai cache ialah antara muka FeginClient yang kami takrifkan.

public class FeginClientFactory {
 
 /**
  * 缓存所有的Fegin客户端
  */
 private volatile static Map<String, Object> feginClientCache = new HashMap<>();
 
 /**
  * 从Map中获取数据
  * @return 
  */
 @SuppressWarnings("unchecked")
 public static <T> T getFeginClient(Class<T> clazz, String baseUrl){
  if(!feginClientCache.containsKey(baseUrl)) {
   synchronized (FeginClientFactory.class) {
    if(!feginClientCache.containsKey(baseUrl)) {
     T feginClient = Feign.builder().decoder(new JacksonDecoder()).encoder(new JacksonEncoder()).target(clazz, baseUrl);
     feginClientCache.put(baseUrl, feginClient);
    }
   }
  }
  return (T)feginClientCache.get(baseUrl);
 }
}
Salin selepas log masuk

Seterusnya, kami mentakrifkan antara muka FeginClient.

public interface FeginClientProxy {
 @Headers("Content-Type:application/json;charset=UTF-8")
 @RequestLine("POST /user/login")
 UserLoginVo login(UserLoginVo loginVo);
}
Salin selepas log masuk

Seterusnya, kami mencipta kelas ujian SpringBoot.

@RunWith(SpringRunner.class)
@SpringBootTest
public class IcpsWeightStarterTest {
 @Test
 public void testUserLogin() {
  ResponseMessage result = FeginClientFactory.getFeginClient(FeginClientProxy.class, "http://127.0.0.1").login(new UserLoginVo("zhangsan", "123456", 1));
  System.out.println(JsonUtils.bean2Json(result));
 }
}
Salin selepas log masuk

Semuanya sudah sedia, jalankan ujian. Alamak, sesuatu telah berlaku. Masalah utama ialah pengecualian berlaku apabila medan LocalDateTime mengembalikan nilai melalui permintaan OpenFeign! ! !

Nota: Apabila pengecualian berlaku pada masa ini, anotasi yang kami tambahkan pada medan LocalDateTime adalah seperti berikut.

import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;


@TableField(value = "CREATE_TIME", fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", locale = "zh", timezone = "GMT+8")
private LocalDateTime createTime;
Salin selepas log masuk

Menyelesaikan masalah

Penerangan masalah

SpringBoot memanggil antara muka HTTP melalui klien OpenFeign asli Jika nilai pulangan mengandungi jenis LocalDateTime (. termasuk kelas JSR -Masa lain bagi pakej java.time dalam -310), ralat kegagalan penyahserikatan mungkin berlaku pada klien. Mesej ralat adalah seperti berikut:

Disebabkan oleh: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Tidak dapat membina instance `java.time.LocalDateTime` (tiada Pencipta, seperti binaan lalai, wujud): tiada kaedah pembina/kilang hujah-String untuk dinyahsiri daripada nilai String ("2020-10-07T11:04:32")

Analisis Masalah

Daripada Apabila pelanggan memanggil fegin, ia bersamaan dengan menghantar parameter dalam URL, yang bersamaan dengan penukaran JSON Pangkalan data mengeluarkan data '2020-10-07T11:04:32' Ini adalah jenis masa . Selepas memasukkan JSON, ia menjadi jenis String T menjadi watak dan bukan lagi watak istimewa, jadi deserialisasi rentetan String "2020-10-07T11:04:32" akan gagal >Penyelesaian Masalah


Tambah kebergantungan pada projek

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.9</version>
</dependency>
Salin selepas log masuk

Nota: Jika anda menggunakan SpringBoot dan versi SpringBoot dinyatakan dengan jelas, anda tidak perlu menyatakan nombor versi apabila. memperkenalkan jackson-datatype-jsr310 🎜>Seterusnya, tambahkan anotasi berikut pada medan jenis LocalDateTime bagi kelas POJO Kesan selepas menambah

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
Salin selepas log masuk

adalah seperti berikut dan masalah selesai 🎜>

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah penyepaduan OpenFeign dengan SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan