0

私には一生解決できない設計上の問題があります。良いコードには重複がありません。DAO を一般化したので、すべての基本的な crud 操作が継承されます。注釈付きコントローラーを使用して Spring MVC で同じことをしようとしています。

この質問を見つけましたが、答えはありません: Spring 3 MVC Standard および 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
4

1 に答える 1

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> { ... }
于 2012-11-30T17:27:17.030 に答える