仅使用一个控制器 Spring 不支持执行方法

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

大家早上好,我在这个问题上遇到了困难。我可以解决这个问题,但我想了解为什么会发生这种情况。到目前为止,我正在使用 Spring、Spring Security、Data Rest 和 Data Mongo DB。 到目前为止,DAO 和控制器还没有出现任何问题,一切似乎都工作正常。我添加了一个新文档:

@Document
public class PlanDeEntrenamiento {
  @Id
  private String id;
  private String nombre;
  private String objetivo;
  private String descripcion;
  private List<SesionDePlan> sesiones;
  private String autor;
}

这就是 DAO:

@RepositoryRestResource(path = "planes", itemResourceRel = "plan",
    collectionResourceRel = "planes")
public interface PlanDeEntrenamientoDAO extends MongoRepository<PlanDeEntrenamiento, String> {
  List<PlanDeEntrenamiento> findByNombre(String nombre);
  List<PlanDeEntrenamiento> findByObjetivo(String objetivo);
}

这是安全配置:

@Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http.csrf(csrf -> csrf.disable())
        .authorizeHttpRequests(authRequest -> authRequest
            .requestMatchers("/api/autenticacion/cambioPassword").authenticated()
            .requestMatchers("/api/autenticacion/login",
                "/api/autenticacion/registro/**",
                "/api/autenticacion/reset-password").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/invitaciones").authenticated()
            .requestMatchers(HttpMethod.GET,"/api/invitaciones/**").permitAll()
            .requestMatchers("/api/fichas/aprobado").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/fichas/**").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/ejercicios").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/planes").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/planes/**").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/ejercicios/**").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/equipamientos").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/usuarios/existe-email").permitAll()
            .requestMatchers(HttpMethod.GET, "/api/usuarios/search/existsByNombre").permitAll()
            .anyRequest().authenticated())
        .sessionManagement(sessionManager ->
            sessionManager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        .authenticationProvider(this.PROVIDER)
        .addFilterBefore(this.FILTER, UsernamePasswordAuthenticationFilter.class)
        .build();
  }

现在,我创建一个控制器:

@RestController
@RequestMapping("api/planes")
public class PlanDeEntrenamientoController {
  @Autowired
  PlanDeEntrenamientoDAO planDeEntrenamientoDAO;
  @Autowired
  SesionDAO sesionDAO;

  @GetMapping
  public ResponseEntity<List<PlanDeEntrenamientoResponse>> getPlanes() {
    List<PlanDeEntrenamiento> planes = planDeEntrenamientoDAO.findAll();
    List<PlanDeEntrenamientoResponse> planesResponse = new ArrayList<>();
    planesResponse = planes.stream().map(plan -> {
      PlanDeEntrenamientoResponse planResponse = new PlanDeEntrenamientoResponse();
      planResponse.setId(plan.getId());
      planResponse.setNombre(plan.getNombre());
      planResponse.setObjetivo(plan.getObjetivo());
      planResponse.setDescripcion(plan.getDescripcion());
      planResponse.setAutor(plan.getAutor() != null ? plan.getAutor() : null);
      return  planResponse;
    }).collect(Collectors.toList());
    return ResponseEntity.ok(planesResponse);
  }
  @GetMapping("/{id}")
  public ResponseEntity<PlanDeEntrenamiento> getPlanes(@PathVariable String id) {
    PlanDeEntrenamiento planDeEntrenamiento = planDeEntrenamientoDAO.findById(id).orElseThrow();
    return ResponseEntity.ok(planDeEntrenamiento);
  }
  @PostMapping("/{id}/agregarSesiones")
  public ResponseEntity<Boolean> getPlanes(@PathVariable String id, @RequestBody
  AgregarSesionesRequest request) {
    PlanDeEntrenamiento plan = planDeEntrenamientoDAO.findById(id).orElseThrow();
    plan.getSesiones().forEach(sesion -> {
      Sesion nuevaSesion = new Sesion();
      nuevaSesion.setNombre(sesion.getNombre());
      nuevaSesion.setFichas(sesion.getFichas());
      nuevaSesion.setGrupo(request.getGrupo());
      LocalDate fechaSesion = request.getFecha().plusDays(sesion.getDia() - 1);
      nuevaSesion.setFecha(fechaSesion);
      nuevaSesion.setUnidad(request.getUnidad());
      sesionDAO.save(nuevaSesion);
    });
    return ResponseEntity.ok(true);
  }
}

之后,当我想使用数据休息提供的端点发布、放置或修补某些内容时,日志如下:

Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' is not supported] 

当然,我可以手动定义端点,但使用数据休息的点不必这样做,而且我所做的与其他控制器没有什么不同,在其他控制器中我没有任何问题。任何提示将不胜感激。

谢谢。

java spring rest security
1个回答
0
投票

好吧,问题出在这个方法上:

  @GetMapping("/{id}")
  public ResponseEntity<PlanDeEntrenamiento> getPlanes(@PathVariable String id) {
    PlanDeEntrenamiento planDeEntrenamiento = planDeEntrenamientoDAO.findById(id).orElseThrow();
    return ResponseEntity.ok(planDeEntrenamiento);
  }

我已经删除它,因为我发现没有必要,我有它,因为我之前做了一些测试,然后没有删除它。删除它后,

"/{id}"
的每个放置或补丁都重新开始工作。但是,如果有人可以向我解释这一点,那将会很有帮助。

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