Spring Boot 如何在Sping Boot 中为控制器创建具有泛型的抽象类?

6pp0gazn  于 2023-11-17  发布在  Spring
关注(0)|答案(3)|浏览(145)

我正在Sping Boot 上开发一个应用程序,我有两个控制器来处理电影和用户。这两个控制器都有类似的端点,我想创建一个抽象类来简化和扩展我的代码。下面是我用途:使用的控制器示例:

@RestController
public class FilmController {
  private static Map<Integer, Film> films = new HashMap<>();

  @PostMapping("/film")
  public Film addFilm(@RequestBody Film film) {
      films.put(film.getId(), film);
      return film;
  }

  @PutMapping("/film")
  private Film updateFilm(@RequestBody Film film) {
      films.put(film.getId(), film);
      return film;
  }

  @GetMapping("/films")
  private List<Film> getAllFilms() {
      return new ArrayList<>(films.values());
  }
}

个字符
我可以使用一个抽象类与泛型吗?如果可以,我怎么做?我想创建一个抽象类,将处理这两个控制器的公共逻辑。你能给我解释一下,什么是更好的使用和为什么?

ao218c7q

ao218c7q1#

看起来通用的CRUD控制器是您所追求的。
在这种情况下,我建议你看看spring-data-rest
获取所有CRUD功能就像用@RepositoryRestResource注解Spring Data存储库一样简单。
当然,如果您计划使用Spring Data作为实体的持久化层。

92dk7w1h

92dk7w1h2#

是否可以接受以下内容?
1.创建通用控制器对象

public class GenericController <T extends Identifiable>{
     private Map<Integer, T> genericMap;

     public GenericController() {
         genericMap = new HashMap<>();
     }

     public T create(T t) {
         genericMap.put(t.getid(), t);
         return t;
     }
 }

字符串
这为您创建控制器和方法提供了基础。
1.创建接口以确保泛型方法正常工作。在上面的例子中,创建对象需要一个id。因此,我创建了一个名为Identifiable的接口,并让genericController中的T扩展它。

public interface Identifiable {
    public Integer getid();
}


1.创建你的控制器,根据需要自动装配genericMap(不要忘记在某个@Configuration类中将通用Map设置为bean!)

@RestController
public class UserController {
    @Autowired
    GenericController<User> userController;

    @PostMapping("/user")
    private User createUser(@RequestBody User user) {
        return userController.create(user);
    }
}


顺便说一下,我认为只有在一定程度上你才能重构/泛化你的代码。如果我在想你想要什么,你想要一个通用/抽象控制器,那么你只需要在指定类型的同时扩展它,就可以了。但是,你仍然需要指定RequestMapping的端点,因为如果我没有弄错的话,你将无法动态配置它。所以即使这样,类应该看起来像这样:

public abstract class GenericController <T extends Identifiable>{
    private Map<Integer, T> genericMap;

    public GenericController() {
        genericMap = new HashMap<>();
    }

    public T create(T t) {
        genericMap.put(t.getId(), t);
        return t;
    }
}
@RestController
public class UserController extends GenericController<User> {
//  GenericController<User> userController;

//    @PostMapping("/user")
//    private User createUser(@RequestBody User user) {
//        return userController.create(user);
//    }

    @PostMapping("/user")
    public User create(User user ) {
        return super.create(user);
    }
}

vhipe2zx

vhipe2zx3#

你绝对可以!试试这样:

public abstract class BaseController<T> {

    private Map<Integer, T> entities = new HashMap<>();

    @PostMapping
    public T addEntity(@RequestBody T entity) {
        entities.put(getEntityId(entity), entity);
        return entity;
    }

    @PutMapping
    public T updateEntity(@RequestBody T entity) {
        entities.put(getEntityId(entity), entity);
        return entity;
    }

    @GetMapping("/all")
    public List<T> getAllEntities() {
        return new ArrayList<>(entities.values());
    }

    protected abstract Integer getEntityId(T entity);
}

字符串
但是我建议你使用ResponseEntity<>来处理http异常。

相关问题