Heim  >  Artikel  >  Java  >  So lösen Sie die Fallstricke der Integration von OpenFeign mit SpringBoot

So lösen Sie die Fallstricke der Integration von OpenFeign mit SpringBoot

PHPz
PHPznach vorne
2023-05-22 18:19:06921Durchsuche

Das Projekt integriert OpenFegin

OpenFegin-Abhängigkeiten integrieren

Lassen Sie mich zunächst etwas über die vom Gesamtprojekt verwendete SpringBoot-Version sagen, und das native OpenFegin verwendet 11.0 Die folgende Methode im POM OpenFegin wird in .xml eingeführt.

<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>

Hier habe ich einige andere Konfigurationselemente weggelassen.

Als nächstes begann ich, OpenFegin zum Aufrufen von Remotediensten in meinem Projekt zu verwenden. Die spezifischen Schritte sind wie folgt.

Remoteanrufe implementieren

Erstellen Sie zunächst die OpenFeignConfig-Klasse und konfigurieren Sie den von OpenFegin standardmäßig verwendeten Vertrag.

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

Als nächstes schreiben wir eine allgemeine Factory-Klasse zum Abrufen von OpenFeign-Clients. Sie verwendet im Wesentlichen eine HashMap, um alle FeginClients zwischenzuspeichern. Der Schlüssel ist die Basis-URL der angeforderten Verbindung und der zwischengespeicherte Wert ist die von uns definierte FeginClient-Schnittstelle.

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

Als nächstes definieren wir eine FeginClient-Schnittstelle.

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

Als nächstes erstellen wir die SpringBoot-Testklasse.

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

Alles ist bereit, führen Sie den Test durch. Verdammt, etwas ist schief gelaufen. Das Hauptproblem besteht darin, dass eine Ausnahme auftritt, wenn das Feld LocalDateTime den Wert über die OpenFeign-Anfrage zurückgibt! ! !

Hinweis: Wenn zu diesem Zeitpunkt eine Ausnahme auftritt, fügen wir dem Feld LocalDateTime die folgende Anmerkung hinzu.

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;

Lösen Sie das Problem

Problembeschreibung

SpringBoot ruft die HTTP-Schnittstelle über den nativen OpenFeign-Client auf. Wenn der Rückgabewert den Typ LocalDateTime enthält (einschließlich anderer Zeitklassen des java.time-Pakets in JSR-310), Möglicherweise tritt auf dem Client ein Deserialisierungsfehler auf. Die Fehlermeldung lautet wie folgt:

Verursacht durch: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Instanz von „java.time.LocalDateTime“ kann nicht erstellt werden (keine Ersteller, wie das Standardkonstrukt, vorhanden): kein String- Argumentkonstruktor/Factory-Methode zum Deserialisieren aus dem String-Wert („2020-10-07T11:04:32“)

Problemanalyse

Der Aufruf von fegin vom Client entspricht auch der Übergabe von URL-Parametern, was einem entspricht JSON-Konvertierung, Datenbank Nehmen Sie die Daten „2020-10-07T11:04:32“ heraus. Diese Zeit ist vom Zeittyp. Nach der Eingabe von JSON wird sie zum String-Typ. T wird zu einem Zeichen und ist kein Sonderzeichen mehr. Daher Die Deserialisierung der Zeichenfolge „2020 -10-07T11:04:32“ schlägt fehl.

Problem gelöst

Abhängigkeiten im Projekt hinzufügen.

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.9</version>
</dependency>

Hinweis: Wenn Sie SpringBoot verwenden und die SpringBoot-Version eindeutig angegeben ist, führen Sie sie ein jackson -datatype-jsr310, Sie müssen die Versionsnummer nicht angeben.

Fügen Sie als Nächstes die folgende Anmerkung zum Typfeld LocalDateTime der POJO-Klasse hinzu. Der Effekt nach dem Hinzufügen ist wie folgt Rufen Sie die Remote-Schnittstelle erneut auf. Problem gelöst

Das obige ist der detaillierte Inhalt vonSo lösen Sie die Fallstricke der Integration von OpenFeign mit SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen