StackOverflowError в тесте загрузки Spring с клиентом FeignJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 StackOverflowError в тесте загрузки Spring с клиентом Feign

Сообщение Anonymous »

Я обнаружил ошибку StackOverflowError при запуске теста Spring Boot, в котором используется клиент Feign. Несмотря на издевательство над клиентом Feign, ошибка все равно возникает. Ниже приведены соответствующие фрагменты кода и трассировка стека ошибок. Мы будем очень признательны за любые идеи и предложения.
Ожидаемый результат возвращается, но за ним следует StackOverflow.
Я пытаюсь вызвать этот API: https:// api-ninjas.com/api/quotes

Код: Выделить всё

@Test
public void getQuotesTest() {
Quote[] quotes = reportsService.getQuotes("happiness");
for (Quote quote : quotes) {
System.out.println("!!!!!!" + quote);
}
}

Класс Quote

Код: Выделить всё

package blossom.reports_service.model;

public class Quote {
private String quote;
private String author;

public Quote() {
}

public Quote(String quote, String author) {
this.quote = quote;
this.author = author;
}

// Getters and setters
public String getQuote() {
return quote;
}

public void setQuote(String quote) {
this.quote = quote;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

@Override
public String toString() {
return "Quote{" +
"quote='" + quote + '\'' +
", author='"  + author + '\'' +
'}';
}
}

Метод getQuotes

Код: Выделить всё

public Quote[] getQuotes(String category) {
// return if list is not empty, otherwise throw exception
Quote[] quotes = quotesClient.getQuotes(apiKey, category);
if (quotes.length == 0) {
throw new NotFoundException("No quotes found for the given category");
}
return quotes;
}

Имитация клиентского интерфейса

Код: Выделить всё

@FeignClient(name = "quotesClient", url = "https://api.api-ninjas.com/v1/")
public interface QuotesServiceClient {

@GetMapping("/quotes")
Quote[] getQuotes(@RequestHeader("X-Api-Key") String apiKey, @RequestParam("category") String category);
}
Трассировка стека

Код: Выделить всё

java.lang.StackOverflowError: null
at java.base/java.lang.invoke.MethodType.insertParameterTypes(MethodType.java:487) ~[na:na]
MethodType.java:487
at java.base/java.lang.invoke.MethodHandles.dropArgumentsTrusted(MethodHandles.java:5367) ~[na:na]
MethodHandles.java:5367
at java.base/java.lang.invoke.StringConcatFactory.generateMHInlineCopy(StringConcatFactory.java:534) ~[na:na]
StringConcatFactory.java:534
at java.base/java.lang.invoke.StringConcatFactory.makeConcatWithConstants(StringConcatFactory.java:365) ~[na:na]
StringConcatFactory.java:365
at java.base/java.lang.invoke.BootstrapMethodInvoker.invoke(BootstrapMethodInvoker.java:102) ~[na:na]
BootstrapMethodInvoker.java:102
at java.base/java.lang.invoke.CallSite.makeSite(CallSite.java:316) ~[na:na]
CallSite.java:316
at java.base/java.lang.invoke.MethodHandleNatives.linkCallSiteImpl(MethodHandleNatives.java:274) ~[na:na]
MethodHandleNatives.java:274
at java.base/java.lang.invoke.MethodHandleNatives.linkCallSite(MethodHandleNatives.java:264) ~[na:na]
MethodHandleNatives.java:264
at org.springframework.context.support.DefaultLifecycleProcessor.doStop(DefaultLifecycleProcessor.java:374) ~[spring-context-6.1.5.jar:6.1.5]
DefaultLifecycleProcessor.java:374
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.stop(DefaultLifecycleProcessor.java:487) ~[spring-context-6.1.5.jar:6.1.5]
DefaultLifecycleProcessor.java:487
at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
Iterable.java:75
at org.springframework.context.support.DefaultLifecycleProcessor.stopBeans(DefaultLifecycleProcessor.java:317) ~[spring-context-6.1.5.jar:6.1.5]
DefaultLifecycleProcessor.java:317
at org.springframework.context.support.DefaultLifecycleProcessor.stop(DefaultLifecycleProcessor.java:190) ~[spring-context-6.1.5.jar:6.1.5]
DefaultLifecycleProcessor.java:190
at org.springframework.context.support.AbstractApplicationContext.stop(AbstractApplicationContext.java:1526) ~[spring-context-6.1.5.jar:6.1.5]
AbstractApplicationContext.java:1526
at org.springframework.context.support.DefaultLifecycleProcessor.doStop(DefaultLifecycleProcessor.java:361) ~[spring-context-6.1.5.jar:6.1.5]
DefaultLifecycleProcessor.java:361
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.stop(DefaultLifecycleProcessor.java:487) ~[spring-context-6.1.5.jar:6.1.5]
DefaultLifecycleProcessor.java:487
Дополнительные шаги по отладке, которые я предпринял
  • Издевался над клиентом Feign: гарантировал, что клиент Feign правильно имитируется вернуть заранее определенный ответ.
  • Упрощенный контекст Spring: создан минимальный тестовый контекст Spring Boot, чтобы изолировать проблему.

Код: Выделить всё

@SpringBootTest
@ExtendWith(SpringExtension.class)
public class SimplifiedReportsServiceTest {

@MockBean
private QuotesServiceClient quotesClient;

@Autowired
private ReportsService reportsService;

@Test
public void getQuotesTest() {
Quote[] mockQuotes = new Quote[]{new Quote("Happiness is a journey, not a destination.")};
when(quotesClient.getQuotes(anyString(), anyString())).thenReturn(mockQuotes);

Quote[] quotes = reportsService.getQuotes("happiness");
for (Quote quote : quotes) {
System.out.println("!!!!!!" + quote);
}
}
}

Несмотря на эти усилия, ошибка StackOverflowError по-прежнему возникает. Мне нужен совет о том, что может быть причиной этой проблемы, или о других шагах по отладке, которые мне следует предпринять.
Спасибо за вашу помощь!

Подробнее здесь: https://stackoverflow.com/questions/785 ... ign-client
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»