- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在创建一个项目,它将响应收集多个 bean 对象,将其保存到数据库并返回事务的状态。可以从客户端发送多个对象。对于每个对象,它们都有单独的数据库,因此也有单独的 Controller 。
所以我计划创建一个框架,它可以接受来自多个 Controller 的多个对象,并且只发送一个集中式对象。但我不确定如何在 Controller 中使用集中对象作为返回类型(目前我将它们返回为 Object
)。以下是我的代码:
Controller :
@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);
}
}
服务:
@Service
@Transactional(isolation = Isolation.READ_COMMITTED)
public class PlayerServiceImpl implements StatService<PlayerValue> {
@Autowired
private PlayerRepository repository;
@Override
public PlayerValue findByNumber(String number) {
Optional<PlayerEntity> numberValue = repository.findByNumber(number);
return numberValue.map(PlayerEntity::toValue).orElse(null);
}
}
在服务中,我返回了 PlayerValue
对象,但我想将此对象包装到一个集中的 bean ResponseValue 中。我为此创建了一个方面
@Aspect
@Component
public class Converter {
private static final Logger LOG = LoggerFactory.getLogger(Converter.class);
@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void restControllerClassMethod() {}
private <T> ResponseValue<T> convert(List<T> results) {
String message = results.isEmpty() ? "No result found" : ResponseValueStatus.OK.toString();
return new ResponseValue<>(ResponseValueStatus.OK, message, results);
}
@Around("restControllerClassMethod()")
@SuppressWarnings("unchecked")
public <T> ResponseValue<T> convert(ProceedingJoinPoint joinPoint) {
ResponseValue value;
try {
Object findObject = joinPoint.proceed();
List<Object> objects = toList(findObject);
value = convert(objects);
} catch (NullPointerException e) {
throw new StatException(String.format("Exception thrown from %s from %s method with parameter %s", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), joinPoint.getArgs()[0].toString()));
//this exception will go in a controller advice and create a response value with this message
} catch (Throwable e) {
LOG.error("Exception occurred while converting the object", e);
throw new StatException(String.format("Exception thrown from %s from %s method with parameter %s with exception message %s", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), joinPoint.getArgs()[0].toString(), e.getMessage()));
}
return value;
}
private List<Object> toList(Object findObject) {
List<Object> objects = new ArrayList<>();
if (findObject instanceof List) {
((List) findObject).forEach(item -> objects.add(findObject));
} else {
objects.add(findObject);
}
return objects;
}
}
总而言之,可能有多个类似于 PlayerValue 的实体。我需要一种将结果返回到集中式 bean 的方法。上面的过程工作,但为此我必须在 Controller
中将返回类型作为 Object
。有谁知道我如何在 Controller 中使用返回类型作为 List 或 T 。我也知道它可以通过实现 ValueConverter
接口(interface)来完成,但是这种转换很简单。因此,如果任何其他开发人员不必在每次想要添加不同的 Controller 时都实现 ValueConverter
,那就太好了。
还可以随时查看实现情况,如果有人有其他想法或意见,请告诉我。
注意:我减少了问题中的大量代码,以便在不了解实际需求上下文的情况下更容易理解。如果有人需要更多信息,请告诉我。
最佳答案
经过一些研究,我发现了一个更好的框架设计解决方案(但当然有缺陷),以实现向多个域对象的集中式 bean 的转换是使用标记接口(interface)。
Marker 接口(interface)可以为所有的bean 提供一个集中的类型。客户端需要遵循的主要规则是实现该标记接口(interface)。所以基本的解决方案是
标记界面:
public interface StateResponseValue<T> {
}
在所有bean中实现接口(interface)。
public class PlayerValue implements StateResponseValue<PlayerValue> {
}
public class ResponseValue<T> implements StateResponseValue<T> {
//fields and their getter and setter
}
更改服务和 Controller 的返回类型。
public interface StatService<T> {
StateResponseValue<T> findByNumber(String number);
}
更改 Controller 中的返回类型
@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);
}
}
注意:我觉得主要的缺点是,每当我们要访问字段时,客户端都需要显式地将对象强制转换为 ResponseValue
,这仍然很丑陋。
关于java - 自动转换为多个域对象的集中式 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51381023/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!