2015-12-08 58 views
1

我已經工作正常春天控制器,在那裏我有一個下面的方式映射春季控制器:聯合Spring註解定製標註不起作用

@RequestMapping(
    value = "/users" 
    consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, 
    produces = MimeTypeUtils.APPLICATION_JSON_VALUE, 
    method = RequestMethod.GET) 
@ResponseBody 
@ResponseStatus(HttpStatus.OK) 
public UserResponse retrieveUsers() { 
    return new UserResponse(); 
} 

@RequestMapping(
    value = "/contracts" 
    consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, 
    produces = MimeTypeUtils.APPLICATION_JSON_VALUE, 
    method = RequestMethod.GET) 
@ResponseBody 
@ResponseStatus(HttpStatus.OK) 
public ContractResponse retrieveContracts() { 
    return new ContractResponse(); 
} 

這工作得很好,GET請求服務所接受的方法,在例如POST的情況下,我正在接收適當的405狀態碼。

現在我想介紹自定義組合註釋,而不是在每個方法中都有相同的批註註釋。

我的自定義註解的樣子,

@RequestMapping(
     consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, 
     produces = MimeTypeUtils.APPLICATION_JSON_VALUE, 
     method = RequestMethod.GET) 
@ResponseBody 
@ResponseStatus(HttpStatus.OK) 
@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Get {} 

因此,我改變方法

@Get 
@RequestMapping(value = "/users") 
public UserResponse retrieveUsers() { 
    return new UserResponse(); 
} 

在這種情況下,我可以看到,無論何種類型的請求,我送/users它是正確送達。例如,即使我做POST,我看到的迴應。所以@RequestMapping不能正常工作。

我在這裏做錯了什麼?使用自定義組合註釋可以使控制器正常工作嗎?

+0

你爲什麼認爲你的'@ Get'會這樣工作? –

+0

爲什麼不呢?事實上,它正在工作,但不正確。例如,至少它會正確返回狀態碼。我假設當我把'''@RequestMapping(value =「/ users」)'''它實際上覆蓋了我自定義註釋中的映射,因爲'''Get'''中的其他註釋實際上正在工作。 – vtor

+0

您是否嘗試將@RequestMapping與一個註釋相結合,並查看是否解決了該問題? – gonzo

回答

1

我懷疑@RequestMapping(value = "/users")UserResponse#retrieveUsers取代@Get接口上的@RequestMapping

見,如果這個工程:

@RequestMapping(
     consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, 
     produces = MimeTypeUtils.APPLICATION_JSON_VALUE, 
     method = RequestMethod.GET) 
@ResponseBody 
@ResponseStatus(HttpStatus.OK) 
@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Get { 

    @AliasFor(annotation = RequestMapping.class, attribute = "value") 
    String[] value() default {}; 
} 

@Get(value = "/users") 
public UserResponse retrieveUsers() { 
    return new UserResponse(); 
} 

你可能會在spring-composed項目感興趣GetJson

請注意,@AliasFor僅在Spring 4.2中發佈。它在早期版本中不可用。

2

您覆蓋了您在@Get註釋中設置的@RequestMapping註釋。因此它僅指定請求映射的value部分,將所有其他屬性保留爲默認值。