Java 自动转换为多个域对象的集中bean
我正在创建一个项目,它将响应收集多个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); } 因此,我计划创建一个框架,可以从多个控制器接受多个对象,并且只发送一个集中对象。但我不知道如何在控制器中将集中式对象用作返回类
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
。