Rumah  >  Artikel  >  Java  >  Bagaimana untuk menyelesaikan masalah penyepaduan OpenFeign dengan SpringBoot

Bagaimana untuk menyelesaikan masalah penyepaduan OpenFeign dengan SpringBoot

PHPz
PHPzke hadapan
2023-05-22 18:19:06918semak imbas

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>

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();
 }
}

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);
 }
}

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);
}

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));
 }
}

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;

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>

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;

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam