java - CrudRepository 不允许删除 @RequestMapping

标签 java spring spring-boot spring-data-jpa spring-hateoas

我已经使用 CustomRepository 中使用的 @RequestMapping 直接公开了存储库方法。 CrudRepository 提供的默认方法可以与 @RequestMapping 配合使用,但 delete(ID id) 除外。

下面给出代码

@RepositoryRestResource(path = "/ces/data/reports")
@RequestMapping("/ces/data/reports")
@Api(value="reports")
public interface IReportRepository<S> extends CrudRepository<Report,Integer> {
    @CrossOrigin
    @RequestMapping(path="/delete/{id}",method = RequestMethod.GET)
    void delete(@PathVariable Integer id);
}

当我们使用 Spring Boot 运行它时,它会抛出错误。 日志打印创建 bean 时删除不明确的方法。

Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'IReportRepository' method
public default void com.pb.ces.emessaging.mvp.web.repository.IReportRepository.delete(java.io.Serializable)
to {[/ces/data/reports/delete/{id}],methods=[GET]}: There is already 'IReportRepository' bean method
public abstract void com.pb.ces.emessaging.mvp.web.repository.IReportRepository.delete(java.lang.Integer) mapped.
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.assertUniqueMethodMapping(AbstractHandlerMethodMapping.java:567)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:531)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:255)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:241)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:213)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:183)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:125)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
        ... 50 more

最佳答案

这是docs

Sometimes you may want to write a custom handler for a specific resource. To take advantage of Spring Data REST’s settings, message converters, exception handling, and more, use the @RepositoryRestController annotation instead of a standard Spring MVC @Controller or @RestController

因此,为了自定义删除方法,您需要创建一个 Controller ,例如 ReportRepositoryController:

@RepositoryRestController
public class ReportRepositoryController {

    @Inject
    private IReportRepository repository;

    @RequestMapping(method = RequestMethod.GET, value = "/ces/data/reports/delete/{id}")
    @ResponseBody
    public ResponseEntity<?> deleteReport(@PathVariable Long id) {
        repository.delete(id);
        return ResponseEntity.ok(HttpStatus.NO_CONTENT);
    }
}

并从 IReportRepository 中删除 delete 方法:

@RepositoryRestResource(path = "/ces/data/reports")
@Api(value="reports")
public interface IReportRepository<S> extends CrudRepository<Report,Integer> {

}

关于java - CrudRepository 不允许删除 @RequestMapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40460597/

相关文章:

java - ClassNotFoundException : org. sqlite.JDBC

java - 异常加载一个非常简单的上下文

java - 如何在响应正文中返回 WireMock 服务器端口

java - 让 Thymeleaf 读取对象模型数组

java - 如何在weka中使用贝叶斯信念网络找到变量之间的因果关系?

java - For 循环不等待 JTextField 中的用户响应

java - 父类(super class)方法在子类中找不到重写的方法

java - 如何覆盖 Spring Security 中特定端点的角色?

java - 如何从 Spring Security 管理中排除特定资源并使其也可供未登录的用户访问?

spring-boot - 在 Spring Boot Jersey 中使用 Jersey Filter