spring boot 除了第一个请求之外,我收到 500 错误

问题描述 投票:0回答:1

我所有的其余控制器都会向第三方网络服务请求以获得权限。

  1. 当我尝试从 Angular 向后端发出两个请求时(getBooks getAUthors 等。它们都向第三方服务发出相同的请求。),第一个请求总是得到 200,另一个请求总是得到 500(我捕获的唯一错误是映射器错误,因为响应正文在 500 中为空)。
  2. 我很少同时得到200。
  3. 在角度中,我尝试直接向第三方网络服务发出两个请求,所有请求都成功。我还尝试了从邮递员直接向网络服务发送 100 个请求,再次得到 200 个。
  4. 所以我认为问题是Spring Boot。我在Spring Boot和异步Apache客户端中尝试了@async,我得到了相同的结果。
  5. 然后我尝试将第三方服务更改为其他服务。但是我得到了所有 200 响应,所以我认为问题可能又出在服务上。
  6. 我找到的唯一解决方案是我将
    syncronized
    添加到向第三方服务发出请求的函数中。但其他开发人员告诉我这不是正确的解决方案。我很困惑。如果有人帮忙,我会整天为他/她祈祷。谢谢。 JwtAuthenticationFilter:
@Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = getTokenFromRequest(request);
        if(StringUtils.hasText(token) && jwtService.validateToken(token)){
            String username = jwtService.getUserName(token);
             //problem is here above
            UserDetails userDetails = customUserDetailsService.loadUserByUsername(username);
           
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(
                    username,
                    null,
                    userDetails.getAuthorities()
            );



            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
    }
    filterChain.doFilter(request, response);
        
}

以及方法内部:

SimpleHttpRequest request = SimpleRequestBuilder.get(url).addParameter("username",username)
                 .addHeader("Content-Type","application/json").addHeader("Accept","*/*").build();
         CloseableHttpAsyncClient client = HttpAsyncClients.custom()
                .build();
         client.start();
         Future<SimpleHttpResponse> future = client.execute(request, null);
         SimpleHttpResponse response = future.get();
        ObjectMapper objectMapper = new ObjectMapper();
        String code = String.valueOf(response.getCode());
        List<UserAuthorityDto> authorities=objectMapper.readValue(response.getBody().getBodyText(), UserAuthorityDto.class).getAuthorities()
                .stream()collect(Collectors.toList());
         client.close();
        return   CompletableFuture.completedFuture(yetkiler);
java spring spring-boot
1个回答
0
投票

500 错误是由代码中的异常引起的。如果不知道错误的根源,就很难进行调试。您应该检查 Spring Boot 应用程序的控制台,看看是否有任何异常或堆栈跟踪。

我建议的第一件事是将您的方法包装在 try/catch 语句中并记录错误,以便您可以更清楚地了解正在发生的情况。

对于初学者,只需执行以下操作:

@RestController
class MyController {

  private static final Logger LOGGER = LoggerFactory.getLogger(MyController.class);

  public Object getResult() {
    try {
      ...
      // All your code here
    } catch (e: Throwable) {

    

  }
© www.soinside.com 2019 - 2024. All rights reserved.