2016-11-07 77 views
1

我已经直接使用@RequestMapping存储库方法在CustomRepository中使用。由CrudRepository提供的默认方法与@RequestMapping一起正常工作,但delete(ID id)除外。下面CrudRepository删除不允许@RequestMapping

@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); 
} 

定的代码,当我们运行这个弹簧引导它抛出一个错误。 日志在创建bean时打印模糊方法delete。

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 

回答

1

这里是docs

有时你可能需要编写自定义的处理器特定资源。为了利用Spring数据REST的设置,信息转换器,异常处理的优势,更多的,使用@RepositoryRestController注释,而不是一个标准的Spring MVC @Controller或@RestController

因此,为了自定义删除方法,您需要创建例如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> { 

} 
+0

感谢parvan。这解决了我的问题。 –

+0

为什么不把它标记为正确的呢? ;) – eparvan

1

CrudRepository已经公开此形式

  • 空隙删除(ID编号)上删除方法 - (ID延伸序列化)
  • 空隙删除(T实体)
  • 空隙deleteAll()

所以如果你定义了void delete(@PathVariable Integer id);它会报错。

定义另一个签名的一种方法将包裹在另一个其他控制器中

相关问题