0

我有一個設計問題,我無法爲我的生活弄清楚。 好的代碼沒有重複。我已經基因化了我的DAO,所以所有基本的crud操作都被繼承了。我試圖用帶註釋控制器的Spring MVC做同樣的事情。如何在Spring MVC中生成REST控制器以刪除複製

我發現這個問題,但沒有答案有:How to Remove Duplication from Spring 3 MVC Standard and Ajax Request Controllers and Views

如果我有像下面的例子,假設我重構使用AbstractBaseService和BaseModel(我這樣做,但沒有代碼),如何我可以將註釋信息放入類似GenericAbstractBaseController或BaseController接口的東西嗎?我試過了(這裏沒有代碼),但問題是註解不是繼承的,不能在運行時添加。

我看到javassist可以用於字節碼修改,這樣我實際上可以在編譯後添加註釋以保持代碼清潔,但這看起來過於複雜。

我給一位導師發了一封便條,他建議使用AOP的命名規則來編織建議或反射來識別來自繼承類的註釋,但我不確定如何才能將這個信息提供給春天,因爲我實際上不能在運行時添加註釋。我想我在這裏錯過了一些重要的關鍵,有人會來這裏 - 他只是送了我幾條線。

這是代碼 - 我該如何刪除重複的crud邏輯。

@Controller 
@RequestMapping("/users") 
public class UserController { 

@Autowired 
UserService userService; 

@RequestMapping(value="/", method = RequestMethod.GET) 
public @ResponseBody List<User> doGetIndex(ModelMap model) { 
    return userService.listPage(0, 10); 
} 

@RequestMapping(value="/{name}", method = RequestMethod.GET) 
public @ResponseBody User doGet(@PathVariable String name, ModelMap model) { 
    return userService.getByUsername(name); 
} 

//post 

//put 

//delete 

回答

0

我不太明白什麼叫「註釋不繼承」的意思,但據我記得下面的辦法應該工作:

public class AbstractController<T> { 
    @RequestMapping(value="", method = RequestMethod.GET) 
    public @ResponseBody List<User> doGetIndex(ModelMap model) { ... } 

    @RequestMapping(value="{name}", method = RequestMethod.GET) 
    public @ResponseBody T doGet(@PathVariable String name, ModelMap model) { ... } 
} 

@Controller 
@RequestMapping("/users") 
public class UserController extends AbstractController<User> { ... } 
+0

運作的?我不認爲註釋是繼承的。我會再嘗試。我有一個這樣的通用抽象控制器 - 我會再試一次,稍後發佈 - 謝謝。 –