Java 自动转换为多个域对象的集中bean

Java 自动转换为多个域对象的集中bean,java,spring,spring-boot,design-patterns,aop,Java,Spring,Spring Boot,Design Patterns,Aop,我正在创建一个项目,它将响应收集多个bean对象,将其保存到数据库并返回事务的状态。可以从客户端发送多个对象。对于每个对象,它们都有单独的数据库,从而有单独的控制器 public interface StatService<T> { StateResponseValue<T> findByNumber(String number); } 因此,我计划创建一个框架,可以从多个控制器接受多个对象,并且只发送一个集中对象。但我不知道如何在控制器中将集中式对象用作返回类

我正在创建一个项目,它将响应收集多个bean对象,将其保存到数据库并返回事务的状态。可以从客户端发送多个对象。对于每个对象,它们都有单独的数据库,从而有单独的控制器

public interface StatService<T> {
    StateResponseValue<T> findByNumber(String number);
}
因此,我计划创建一个框架,可以从多个控制器接受多个对象,并且只发送一个集中对象。但我不知道如何在控制器中将集中式对象用作返回类型(目前我将它们作为
对象
返回)。下面是我的代码:

控制器:

@RestController
@RequestMapping("/stat/player")
public class PlayerController {

    @Autowired
    private StatService<PlayerValue> statPlayer;

    @RequestMapping("/number/{number}")
    public Object findByNumber(@PathVariable String number) { // Here returning Object seem odd
        return statPlayer.findByNumber(number);
    }
}
总而言之,可能存在多个类似于PlayerValue的实体。我需要一种在集中bean中返回结果的方法。上面的过程是可行的,但为此,我必须在
控制器
中给出返回类型为
对象
。有人知道如何在控制器中使用返回类型作为List或T吗。我还知道可以通过实现
ValueConverter
接口来实现,但这种转换非常简单。因此,如果任何其他开发人员不必每次添加不同的控制器时都实现
ValueConverter
,那就太好了

public interface StatService<T> {
    StateResponseValue<T> findByNumber(String number);
}
另外,请随时查看实施情况,如果有人有其他想法或意见,请告诉我


注意:我减少了问题中的大量代码,以便在不了解实际需求上下文的情况下更容易理解。如果有人需要更多信息,请务必告诉我。

如果您创建一个通用的
AbstractStatController
,该怎么办

通用接口
StatService

public interface StatService<T> {
    T findByNumber(String number);
}
混凝土等级
PlayerController

public abstract class AbstractStatController<T> {

    abstract StatService<T> getStatService();

    @RequestMapping("/number/{number}")
    public T findByNumber(@PathVariable String number) {
        return getStatService().findByNumber(number);
    }

}
@RestController
@RequestMapping("/stat/player")
public class PlayerController extends AbstractStatController<Player> {

    private final PlayerService playerService;

    public PlayerController(PlayerService playerService) {
        this.playerService = playerService;
    }

    @Override
    StatService<Player> getStatService() {
        return playerService;
    }
}
@RestController
@请求映射(“/stat/player”)
公共类PlayerController扩展AbstractStatController{
私人最终播放服务播放服务;
公共播放器控制器(PlayerService PlayerService){
this.playerService=playerService;
}
@凌驾
StatService getStatService(){
返回playerService;
}
}

经过一些研究,我找到了一个更好的框架设计解决方案(当然也有缺陷),要实现对多个域对象的集中式bean的转换,需要使用标记接口

标记接口可以为所有bean提供一个集中的类型。客户端需要遵循的主要规则是实现该标记接口。所以基本的解决办法是

标记接口:

public interface StateResponseValue<T> {
}
公共接口状态响应值{
}
在所有bean中实现接口

public class PlayerValue implements StateResponseValue<PlayerValue> {
}

public class ResponseValue<T> implements StateResponseValue<T> {

    //fields and their getter and setter
}
public类PlayerValue实现statesponsevalue{
}
公共类ResponseValue实现StateResponseValue{
//字段及其getter和setter
}
在服务和控制器中更改返回类型

public interface StatService<T> {
    StateResponseValue<T> findByNumber(String number);
}
公共接口StatService{
StateResponseValue findByNumber(字符串编号);
}
更改控制器中的返回类型

@RestController
@RequestMapping("/stat/player")
public class PlayerController {

    @Autowired
    private StatService<PlayerValue> statPlayer;

    @RequestMapping("/number/{number}")
    public StateResponseValue<T> findByNumber(@PathVariable String number) { // Here returning Object seem odd
        return statPlayer.findByNumber(number);
    }
}
@RestController
@请求映射(“/stat/player”)
公共类播放控制器{
@自动连线
专用StatService statPlayer;
@请求映射(“/number/{number}”)
public StateResponseValue findByNumber(@PathVariable String number){//这里返回的对象看起来很奇怪
返回statPlayer.findByNumber(number);
}
}

注意:我觉得主要的缺点是,每当我们想要访问字段时,客户端都需要显式地将对象强制转换为
ResponseValue
,这仍然很难看。

感谢您的反馈。你的建议可能会奏效,但对于我之前所做的重构版本来说,情况是一样的。如果程序员扩展
AbstractController
时也可以返回
Player
值,则可能会出现这种情况。但是我希望他只返回
ResponseValue
object抽象方法应该根据OPs要求返回
ResponseValue