Неразрешимая ошибка переполнения стека в Java Spring BootJAVA

Программисты JAVA общаются здесь
Anonymous
Неразрешимая ошибка переполнения стека в Java Spring Boot

Сообщение Anonymous »

У меня есть эта проблема, где, отправив любой запрос из моего веб -приложения Frontend (Next.js) в мое бэкэнд -приложение в Spring Boot, я получаю ошибку переполнения стека, и не только это, но мое приложение становится совершенно бесполезным и всегда бросает эту ошибку, независимо от того, что до перезапуска компьютера. Таким образом, если эта ошибка запускается, которую я не нашел источника, но только некоторые возможные причины, то в основном вся моя IDE (IntelliJ) обладает, даже если я перестраиваю приложение из источника, или аннулировать кэши или чистить с помощью Maven, ничего не работает, кроме как перезагрузка чистых окон, чтобы решить проблему. Я также наблюдал, как эта проблема также произошла в Linux через активное экземпляр EC2, который я работал.

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

May 17 20:14:16 ip-IP.us-east-2.compute.internal java[2209]: 2025-05-17T20:14:16.996Z ERROR 2209 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Filter execution threw an exception] with root cause
May 17 20:14:16 ip-IP.us-east-2.compute.internal java[2209]: java.lang.StackOverflowError: null
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.core.BridgeMethodResolver.findBridgedMethod(BridgeMethodResolver.java:71) ~[spring-core-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:356) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:216) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at jdk.proxy2/jdk.proxy2.$Proxy167.authenticate(Unknown Source) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:216) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at jdk.proxy2/jdk.proxy2.$Proxy167.authenticate(Unknown Source) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:216) ~[spring-aop-6.2.3.jar!/:6.2.3]
May 17 20:14:17 ip-IP.us-east-2.compute.internal java[2209]: at jdk.proxy2/jdk.proxy2.$Proxy167.authenticate(Unknown Source) ~[na:na]
aaaaaAnd повторить еще примерно на тысячу строк. Это приводит к ошибке 500, и иногда она просто вешает ответ на Frontend, в других случаях она фактически бросает InternalServererRor с 500. Я замечаю, что ошибка встречается чаще всего при попытке исправить эти файлы cookie /httpservletresponse, связанные с SOE, которые образуются в моем коде. Даже конечные точки, которые не существуют (я не написал для них контроллеры) возвращают ту же ошибку SOE, когда их требуют, когда они обычно должны возвращать «без статического ресурса». Это верно и для всех типов запросов, включая те, которые требуют JWT, а те, которые не делают. Следующий код - это то, что я использую для назначения файлов cookie для ответа, который вернется на фронт запроса, чтобы проверить пользователя с помощью файла cookie JWT. Как правило, проблема, скорее всего, будет вызвана чем -то связанным с этим кодом файлов cookie и повторным, и я не уверен, почему. < /P>
// Create and configure cookie for access token
Cookie jwtCookie = new Cookie("auth-token", accessToken);
jwtCookie.setHttpOnly(true);
System.out.println("SECURE COOKIES: " + useSecureCookies);
jwtCookie.setSecure(useSecureCookies); // Change to true in production
jwtCookie.setPath("/");
// Set domain conditionally
if (Objects.equals(frontendUrl, "mydomain.com")) {
jwtCookie.setDomain(".mydomain.com");
System.out.println("TO DOMAIN: " + jwtCookie.getDomain());
}

// Add cookie to response
// String cookieValue = String.format("jwt=%s; Path=/; Max-Age=3600; HttpOnly; Secure; SameSite=None", accessToken);
// response.addHeader("Set-Cookie", cookieValue);
// THIS is the actual thing that adds cookies to the frontend client
response.addCookie(jwtCookie);

// Create and configure cookie for refresh token as well
Cookie refreshCookie = new Cookie("refresh-token", refreshToken);
refreshCookie.setHttpOnly(true);
refreshCookie.setSecure(useSecureCookies); // Change to true in production
refreshCookie.setPath("/");
if (Objects.equals(frontendUrl, "mydomain.com")) {
refreshCookie.setDomain(".mydomain.com");
System.out.println("TO DOMAIN: " + jwtCookie.getDomain());
}

// Conditionally set age based on if user entered "rememberMe" or not
if (request.getRememberMe()) {
refreshCookie.setMaxAge((int) Duration.ofDays(30).toSeconds());
System.out.println("REMEMBERME: " + request.getRememberMe());
System.out.println("MAXAGE: 30 DAYS");
}
else {
refreshCookie.setMaxAge(-1);
System.out.println("REMEMBERME: " + request.getRememberMe());
System.out.println("MAXAGE: UNTIL END OF SESSION");
}

// Add refresh cookie to response
// String refreshValue = String.format("refresh=%s; Path=/auth; Max-Age=2592000; HttpOnly; Secure; SameSite=None", refreshToken);
// response.addHeader("Set-Cookie", refreshValue); // 30 days
// THIS is the actual thing that adds cookies to the frontend client
response.addCookie(refreshCookie)
< /code>
Здесь также является кодом контроллера, который вызывает этот метод службы < /p>
@PostMapping("/login")
public ResponseEntity login(
@RequestBody LoginRequest loginRequest,
HttpServletResponse response
) {
try {
return loginService.authenticate(loginRequest, response);
} catch (RuntimeException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(e.getMessage());
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Unexpected error");
}
}
< /code>
httpstatus.internal_server_error, кстати, никогда не возвращается. Даже если ISE 500 выброшен из SOE, эта строка никогда не возвращается в запрос API, только огромный кусок текста из SOE напрямую.May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: Verifying credentials
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: SECURE COOKIES: true
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: TO DOMAIN: .mydomain.com
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: java.lang.IllegalArgumentException: An invalid domain [.mydomain.com] was specified for this cookie
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:253)
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.tomcat.util.http.Rfc6265CookieProcessor.generateHeader(Rfc6265CookieProcessor.java:147)
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.catalina.connector.Response.generateCookieString(Response.java:881)
May 17 20:25:31 ip-IP.us-east-2.compute.internal java[2209]: at org.apache.catalina.connector.Response.addCookie(Response.java:837)
< /code>
Интересно, что я заметил, что в производстве ошибка SOE все еще может возникнуть, но обычно уходит после небольшого или нескольких запросов, в то время как в Intellij на моей настройке разработчика она остается и буду там каждый раз, когда я запускаю программу, независимо от того, изменяю ли я вещи, инвалидирую кэши или перезапуску Intellij. И просто чтобы уточнить, эта проблема вообще не влияет на запуск программы. Это всегда работает совершенно нормально, если ничто другое не так, как в Dev, так и в Prod. Это только любой запрос, представленный в приложение, которое вызывает ошибку 500 и огромный код ответа. И да, я могу подтвердить, что код одинаково от перезапуска до перезапуска, но сборка и запуск банки и запросы все идут гладко после перезапуска, по крайней мере, до тех пор, пока ошибка снова не запустится. Затем, как я уже говорил, это как бы поправится в Prod через немного, но в Dev я только что вводил постоянно каждый раз, когда я запускаю приложение, пока не перезагружаю свой компьютер.@Component
public class JwtAuthenticationConverter implements Converter {

private final JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter =
new JwtGrantedAuthoritiesConverter();

// These annotations pull data from the yml file
@Value("${jwt.auth.converter.resource-id}")
private String resourceId;
@Value("${jwt.auth.converter.principal-attribute}")
private String principalAttribute = "resource-id";

@Override
public AbstractAuthenticationToken convert(@NonNull Jwt jwt) {
Collection authorities = Stream.concat(
jwtGrantedAuthoritiesConverter.convert(jwt).stream(),
extractResourceRoles(jwt).stream()
)
.collect(Collectors.toSet());

return new JwtAuthenticationToken(jwt, authorities, getPrincipalClaimName(jwt));
}

private String getPrincipalClaimName(Jwt jwt) {
String claimName = JwtClaimNames.SUB;
if (principalAttribute != null) {
claimName = principalAttribute;
}
return jwt.getClaim(claimName);
}

private Collection

Подробнее здесь: https://stackoverflow.com/questions/796 ... pring-boot

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