0

J'ai un problème de conception que je ne peux pas résoudre pour la vie. Le bon code n'a pas de duplication. J'ai généré mon DAO pour que toutes les opérations de base de crud soient héritées J'essaie de faire la même chose avec Spring MVC avec les contrôleurs annotés.Comment générer un contrôleur REST dans Spring MVC pour supprimer la duplication

Je trouve cette question, mais pas de réponse est là: How to Remove Duplication from Spring 3 MVC Standard and Ajax Request Controllers and Views

Si j'ai quelque chose comme l'exemple ci-dessous, en supposant que je factoriser utiliser AbstractBaseService et BaseModel (je l'ai fait, mais ne pas le code), comment puis-je mettre les informations d'annotation dans quelque chose comme une interface GenericAbstractBaseController ou BaseController? J'ai essayé (n'ai pas le code ici) mais le problème est que les annotations ne sont pas héritées et NE PEUVENT PAS être ajoutées à l'exécution.

Je vois que javassist peut être utilisé pour la modification du bytecode afin que je puisse effectivement ajouter des annotations après la compilation pour garder le code propre, mais cela semble être trop complexe. J'ai envoyé une note à un mentor et il a suggéré d'utiliser AOP avec convention de nommage pour tisser des conseils ou une réflexion pour identifier les annotations de la classe héritée, mais je ne suis pas certain comment je pourrais donner cette information au printemps étant donné que je Impossible d'ajouter des annotations lors de l'exécution. Je pense qu'il me manque une clé critique ici que quelqu'un viendra et tombera - il m'a seulement renvoyé quelques lignes.

Voici le code - comment puis-je supprimer la logique crud en double.

@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 

Répondre

0

Je ne comprends pas tout à fait ce que vous entendez par « annotations ne sont pas héritées », mais pour autant que je me rappelle l'approche suivante devrait fonctionner:

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

Est-ce que le travail? Je ne pensais pas que les annotations étaient héritées. Je vais essayer de nouveau. J'ai un contrôleur abstrait générique comme ça - je vais essayer à nouveau et poster plus tard - merci. –

Questions connexes