我正在尝试使用Spring @Configurable并将@AutowireDAO注入域对象,这样他们就不需要直接了解持久层了.
我正在尝试关注http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable,但我的代码似乎没有效果.
基本上,我有:
@Configurable
public class Artist {
@Autowired
private ArtistDAO artistDao;
public void setArtistDao(ArtistDAO artistDao) {
this.artistDao = artistDao;
}
public void save() {
artistDao.save(this);
}
}
Run Code Online (Sandbox Code Playgroud)
和:
public interface ArtistDAO {
public void save(Artist artist);
}
Run Code Online (Sandbox Code Playgroud)
和
@Component
public class ArtistDAOImpl implements ArtistDAO {
@Override
public void save(Artist artist) {
System.out.println("saving");
}
}
Run Code Online (Sandbox Code Playgroud)
在application-context.xml中,我有:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springsource.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
<bean class="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect" factory-method="aspectOf"/>
</beans>
Run Code Online (Sandbox Code Playgroud)
类路径扫描和初始化由弹簧模块执行Play!框架,虽然其他autowired …
我们正在为远程服务编写客户端,该服务公开SOAP Web服务并为这些服务发布WSDL定义.
我们在测试期间无法访问系统,因此我们想编写一个模拟服务.我们正在为客户端使用Python,所以理想情况下我们希望将Python用于模拟服务器,尽管我认为它并非绝对必要.
我们的梦想是能够从我们可以填写的WSDL文件中生成存根,然后使用Paste Deploy作为WSGI服务器提供存根,尽管它不必是Paste Deploy或WSGI,只要它可靠地工作即可.主要的是我们需要从"真正的"WSDL文件生成存根,以便我们不会意外地编写不兼容的模拟服务器.
我们在客户端库中使用suds,并查看了soaplib和ZSI.然而,soaplib中的wsgi2py内容在顶部说"不要使用",ZSI似乎要吞下很多东西.人们通常会用这种东西做什么?
马丁
我们正在仔细研究我们的(Java)Web应用程序模式.在过去,我们遭受了过度贫血的对象模型以及控制器,服务和DAO之间的过度程序分离,其中简单的价值对象(基本上只是数据包)在它们之间传播.我们使用声明性(XML)管理的ORM(Hibernate)来实现持久性.所有实体管理都在DAO中进行.
在尝试转向更丰富的域模型时,我们发现自己在如何最好地设计持久层方面遇到了困难.我花了很多时间阅读和思考领域驱动设计模式.但是,我想要一些建议.
首先,我更自信的事情:
我们前面有"瘦"控制器,只处理HTTP和HTML - 处理表单,验证,UI逻辑.
我们将有一层无状态业务逻辑服务,它们实现常见的算法或逻辑,不知道UI,但非常了解(并委托)域模型.
我们将拥有一个更丰富的域模型,其中包含该域模型中对象固有的状态,关系和逻辑.
问题出在持久性上.以前,我们的服务将通过Spring注入(通过Spring),并使用find()和save()等DAO方法来执行持久性.但是,更丰富的域模型似乎暗示对象应该知道如何保存和删除自己,也许更高级别的服务应该知道如何定位(查询)域对象.
在这里,出现了一些问题和不确定性:
我们是否要将DAO注入域对象,以便它们可以在save()方法中执行"this.someDao.save(this)"?这有点尴尬,因为域对象不是单例,所以我们需要工厂或DAO的后期构建设置.从数据库加载实体时,这会变得混乱.我知道Spring AOP可以用于此,但我无法使用它(使用Play!框架,另一行实验),它看起来非常混乱和神奇.
我们是否将DAO(存储库?)完全分开,与无状态业务逻辑服务相提并论?这可能有一定道理,但这意味着如果"保存"或"删除"是域对象的固有操作,则域对象无法表达这些操作.
我们是否完全免除了DAO并使用JPA让实体自行管理.
下面是下一个细微之处:使用JPA映射实体非常方便.表演!框架为我们提供了一个很好的实体基类,具有save()和delete()等操作.但是,这意味着我们的域模型实体与数据库结构紧密相关,并且我们使用大量持久性逻辑传递对象,可能一直到视图层.如果不出意外,这将使域模型在其他环境中的可重用性降低.
如果我们想避免这种情况,那么我们需要某种映射DAO - 使用简单的JDBC(或至少是Spring的JdbcTemplate),或使用数据库实体和"业务"实体的并行层次结构,DAO永远复制来自一个层次结构到另一个
这里适当的设计选择是什么?
马丁
我想基于现有的WSDL使用Python soaplib模块生成存根SOAP Web服务类.我们的想法是为第三方Web服务生成模拟.
是否存在任何此类代码生成器,或者我们必须编写自己的代码
马丁
想象一个Web应用程序,其路由需要在继续之前检查是否允许用户访问给定资源."经过身份验证"检查依赖于数据库调用.
在每条路线中,我可能有:
authorizeOwnership(req, res)
.then(function() {
// do stuff
res.send(200, "Yay");
});
Run Code Online (Sandbox Code Playgroud)
我希望authorizeOwnership()函数处理403(拒绝访问)和500(例如数据库查询错误)响应,以便每个路由不需要明确地这样做.
我有一个函数可以查询数据库以检查所有权.
function confirmOwnership(resourceId, userId) {
// SequelizeJS... returns a bluebird promise
return Resource.find({
where: {id: resourceId, userId: userId}
})
.then(function(resource) {
if(!resource) {
return null; // no match for this resource id + user id
} else {
return resource;
}
});
}
Run Code Online (Sandbox Code Playgroud)
然后用于authorizeOwnership:
function authorizeOwnership(req, res) {
var rid = parseInt(req.params.rid, 10),
userId = parseInt(req.authInfo.userid, 10);
return new Promise(function(resolve, reject) {
confirmOwnership(rid, …Run Code Online (Sandbox Code Playgroud) 我想编写一些集成测试(使用jest,尽管这可能不是很重要)来测试写入 Cloud Firestore 的“HTTPS 可调用”Firebase Cloud 函数。这些写入又会触发其他 Cloud Functions 函数。我想使用模拟器套件来做到这一点,即不使用远程 Firebase 项目,也不模拟整个 Firebase 机器。我希望能够在 Firestore 中管理装置数据。
仿真器之间的相互作用,@firebase/testing而firebase-functions-test不是在所有明显的给我。
我有这样的助手,我用它们来管理客户端函数或助手函数(在 Cloud Functions 中使用)的测试装置,使用 admin SDK:
const firebase = require('@firebase/testing');
const fs = require('fs');
/**
* Set up mock app. `auth` can be an object like `{uid: "123"}` to simulate
* authentication. `data` is used to set up some mock data ahead of time:
*
*
* data={
* 'collection123/doc123': {
* foo: …Run Code Online (Sandbox Code Playgroud) 我在Meteor应用程序中有一个(客户端)路由器,并使用{{pathFor}}帮助程序进行链接.
我在用户更改表单字段时设置了一个dirty标志Session,并且我想触发警告并允许用户在设置标志时停止从页面导航,基本上就像onunload处理程序一样.
我试过这样做:
Router.onBeforeAction(function(pause) {
var self = this;
if (!this.ready()) {
return;
}
if(Session.get('dirty')) {
if(!confirm("Are you sure you want to navigate away?")) {
pause();
}
}
});
Run Code Online (Sandbox Code Playgroud)
然而,当我得到提示时,我仍然被引导离开.也就是说,pause()似乎没有停止后续的路由器操作,无论它是什么.
我究竟做错了什么?
大多数项目,我们似乎都在做某种SOAP Web服务消费.而且每一次,感觉都像是用砖块反复击中头部.例如,我们最终得到:
在Python中,我使用了Suds(https://fedorahosted.org/suds),它提供了一种非常自然(但显然不太类型安全)的API.我知道这是比较苹果和橙子,但调用远程Web服务的方法必须比生成如此多的代码少得多.
我们可能会暂时在Play框架中使用它,尽管如果可能的话我会喜欢通用的东西.我们也经常使用Spring,虽然我现在正在研究Guice以获得更简单的替代方案.
马丁
我正在使用MartyJS构建一个Flux应用程序(它非常接近"vanilla"Flux并使用相同的底层调度程序).它包含具有固有依赖关系的商店.例如,a UserStore跟踪当前用户,以及InstanceStore跟踪当前用户拥有的数据实例.实例数据是异步从API获取的.
问题是如何处理InstanceStore用户更改时的状态.
我开始相信(例如,阅读@fisherwebdev在SO上的答案),最适合在动作创建者函数中发出AJAX请求,并在动作中产生AJAX"成功"结果,从而导致商店发生变化.
因此,为了获取用户(即登录),我正在动作创建者函数中进行AJAX调用,当它结算时,我RECEIVE_USER将作为有效负载向用户发送动作.在UserStore这个监听并相应地更新其状态.
但是,InstanceStore如果用户更改,我还需要重新获取所有数据.
选项1:我可以RECEIVE_USER在其中监听InstanceStore,如果是新用户,则触发AJAX请求,该请求又创建另一个动作,从而导致InstanceStore更新.这个问题就是它感觉像是级联动作,虽然技术上它是异步的,所以调度员可能会允许它.
选项2:另一种方式是InstanceStore听取发出的变化事件UserStore并进行请求 - 动作舞蹈,但这也是错误的.
选项3:第三种方式是动作创建者编排两个AJAX调用并分别发送这两个动作.但是,现在动作创建者必须知道很多关于商店如何相互关联的信息.
在Flux应用程序中应该在哪里进行ajax请求?让我觉得选项1是正确的,但Flux文档也暗示商店触发行动并不好.
我有一个包含图表的模板,使用MorrisJS渲染.当currentData会话变量发生变化时,图表应该会更新,因此我将其作为一个反应数据源:
Template.chart.rendered = function() {
var template = this;
Deps.autorun(function(c) {
// Stop if the template is removed from the dom
// Q: Is this really right?
if(template.__component__.dom.parentNode() === null) {
c.stop();
return;
}
var results = Session.get('currentData');
// ... render a chart with `results` as the data
Morris.Bar({element: template.$(".chart-container"), data: results, ...});
});
};
Run Code Online (Sandbox Code Playgroud)
请注意我如何检查何时停止上面的自动运行.这是必要的,因为没有这个,当我使用模板(我正在使用iron-router)离开页面到另一个页面并返回时,我会在日志中收到警告,例如"无法选择删除的DomRange".我很确定这种情况正在发生,因为模板实例已被删除,但自动运行仍在运行.
不过,我觉得我在这里做错了.是否有(a)更好的地方放置自动运行以便它没有这个问题,或者(b)在从DOM中删除模板实例时停止计算的更好方法是什么?
我试图找到一种方法来处理created和destroyed处理程序,但我无法弄清楚如何.
soap ×3
java ×2
meteor ×2
python ×2
ajax ×1
aspectj ×1
bluebird ×1
dao ×1
firebase ×1
firebase-cli ×1
iron-router ×1
mocking ×1
oop ×1
promise ×1
reactjs-flux ×1
spring ×1
spring-aop ×1
web-services ×1
wsdl ×1