我们的工作室最近开始采用SOA方法进行应用程序开发.我们看到SOA /微服务的关注点,可重用性和其他好处的分离带来了很多好处.
但是,我们坚持的一个重要项目是跨服务聚合,过滤和分页结果.让我用场景描述问题.
假设我们有3项服务:
现在,假设我们要构建一个可以汇总显示/报告多个服务的报告/管理工具.例如,我们希望显示付款的分页列表,以及每笔付款所针对的人员和项目.这非常简单:获取付款清单,然后查询PersonService和ItemService以获取相应的Person和Item记录.
但是,当我们想要过滤掉这些数据时,问题就会发挥作用:例如,显示由名为"Bob"的人制作的分段付款清单,他们购买了"Car"项.这使得事情变得更加复杂,因为我们需要从3个不同的服务中过滤结果,而不知道每个服务将返回多少结果.
从性能的角度来看,一遍又一遍地查询所有服务以缩小结果将是代价高昂的,所以我一直在研究更好的解决方案.但是,我找不到解决这个问题的具体方法(或者至少是"最佳实践").在单个应用程序中,我们只是在不同的表中使用SQL连接.我在确定如何/如果在服务之间可能出现类似情况时遇到了很多麻烦.
我对社区的问题是:你的方法是什么?我考虑过的事情:
我试图找出一种方法来避免必须从所有拦截器中排除静态内容,而不必exclude-mapping
为每个拦截器指定一个应该忽略这些内容的标签。我的 context.xml 的一部分如下:
<mvc:resources mapping="/assets/**" location="/assets/"/>
<mvc:interceptors>
<bean class="com.myapp.security.interceptor.SecurityInterceptor" />
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/assets/**" />
<bean class="com.myapp.interceptor.MessageInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
Run Code Online (Sandbox Code Playgroud)
如您所见,我已指定/assets/
从 MessageInterceptor 中排除。但是,我也希望 SecurityInterceptor 也排除资源。在 DRY 之后,必须exclude-mapping
为每个拦截器指定一个似乎是不合理的(因为不应该真的有理由拦截资源)。
我四处搜索,找不到任何解决方案。任何帮助表示赞赏!
谢谢
我正在尝试在我们的一个应用程序中实现Hibernate,在Weblogic 11g上运行,并在尝试使用OneToMany,OneToOne和其他连接标记时进行部署时收到以下错误:
java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:591)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at gov.nysed.sedmon.common.context.ContextInitializer.initialize(ContextInitializer.java:21)
at org.springframework.web.context.ContextLoader.customizeContext(ContextLoader.java:491)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:382)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:481)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:181)
at weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java:1872)
at weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:3153)
at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1508)
at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:482)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
at weblogic.application.internal.flow.ScopedModuleDriver.start(ScopedModuleDriver.java:200)
at weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:247)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
at weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:27)
at weblogic.application.internal.BaseDeployment$2.next(BaseDeployment.java:636)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:52)
at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:205)
at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:58) …
Run Code Online (Sandbox Code Playgroud) 我目前正在运行具有多个 PHP 版本(5.3.8、5.4.3)的 Wampserver。Wampserver 允许您轻松地在您希望 apache 使用的 php 版本之间来回切换。但是,我无法处理来自 CLI 的多个版本。我有需要命令行的项目,但有些与 php5.4 兼容,有些则不兼容。
有没有办法在 Windows 中创建某种类型的“别名”,允许我指定在命令行上使用哪个版本的 PHP .. IE: "php54 cache:clear", "php53 cache:clear" ??
谢谢!
在使用正则表达式时遇到麻烦(它们不是我的强项)。我正在尝试匹配{{和}}之间的所有字符串,但是如果在同一行上出现一组括号,则将其视为一次匹配...例如:
$string = "
Hello, kind sir
{{SHOULD_MATCH1}} {{SHOULD_MATCH2}}
welcome to
{{SHOULD_MATCH3}}
";
preg_match_all("/{{(.*)}}/", $string, $matches);
var_dump($matches); // returns arrays with 2 results instead of 3
Run Code Online (Sandbox Code Playgroud)
返回:
array(2) {
[0]=>
array(2) {
[0]=>
string(35) "{{SHOULD_MATCH1}} {{SHOULD_MATCH2}}"
[1]=>
string(17) "{{SHOULD_MATCH3}}"
}
[1]=>
array(2) {
[0]=>
string(31) "SHOULD_MATCH1}} {{SHOULD_MATCH2"
[1]=>
string(13) "SHOULD_MATCH3"
}
}
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?谢谢!
任何人都可以解释Oracle的局限性,因为以下语句在MySQL中有效,但在Oracle中收到"不是GROUP BY表达式"?
SELECT order1.user_id,
order1.order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id
Run Code Online (Sandbox Code Playgroud)
是因为Oracle不知道如何处理该order_datetime
列?它不能像从GROUP BY order1.user_id
MySQL中那样从行中接收到哪一行返回列结果吗?
编辑:
我知道所有列都应该在组中,但是我试图理解为什么Oracle不会像MySQL那样返回类似的结果(而MySQL不需要每个GROUP BY,而Oracle也需要).
我不确定如果没有存储过程这是否可行,但我希望它是可能的:
我的数据库中有一个列存储像3 < x < 5
或20 >= x >= 10
等等的信息.如果我们插入一个#,我需要评估表达式是否为真x
.
目前,我正在使用正则表达式和eval的组合来确定表达式是否为真,如下所示:
$evalExpression = '3<x<5';
$evalValue = 4;
preg_match("#^(.*?)(<=|>=|<|>)(.*?)(<=|>=|<|>)(.*?)$#", $evalExpression, $evalPieces);
if (eval("return {$range_pieces[1]} {$range_pieces[2]} $response && $response {$range_pieces[4]} {$range_pieces[5]};")) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是,我试图找到一种方法,我可以单独使用SQL(MySQL)来实现这一点.例如:
SELECT 3 < 4 && 4 < 5 FROM table X
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否可能?存储过程是否有必要完成这样的事情?我确信一个不同的数据库模式可以使这更容易,但我继承了这个结构,并试图找出我的需求是否可以在诉诸更改模式之前完成.
谢谢!
php ×3
mysql ×2
command-line ×1
database ×1
hibernate ×1
integration ×1
java ×1
jpa ×1
oracle ×1
regex ×1
rest ×1
soa ×1
spring ×1
spring-mvc ×1
sql ×1
wamp ×1
web-services ×1
weblogic ×1
weblogic11g ×1
windows ×1