大家早上好,我在这个问题上遇到了困难。我可以解决这个问题,但我想了解为什么会发生这种情况。到目前为止,我正在使用 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]
当然,我可以手动定义端点,但使用数据休息的点不必这样做,而且我所做的与其他控制器没有什么不同,在其他控制器中我没有任何问题。任何提示将不胜感激。
谢谢。
好吧,问题出在这个方法上:
@GetMapping("/{id}")
public ResponseEntity<PlanDeEntrenamiento> getPlanes(@PathVariable String id) {
PlanDeEntrenamiento planDeEntrenamiento = planDeEntrenamientoDAO.findById(id).orElseThrow();
return ResponseEntity.ok(planDeEntrenamiento);
}
我已经删除它,因为我发现没有必要,我有它,因为我之前做了一些测试,然后没有删除它。删除它后,
"/{id}"
的每个放置或补丁都重新开始工作。但是,如果有人可以向我解释这一点,那将会很有帮助。