2016-11-07 124 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);它會報錯。

定義另一個簽名的一種方法將包裹在另一個其他控制器中

相關問題