我有一个Grails应用程序需要运行一个可能会随着时间的推移而被换出的策略.我知道Spring是Grails的基础,所以我想知道我是否可以访问Spring的IoC容器,这样我就可以将xml文件中的实际依赖项外部化了(注意:我从来没有真正做过这个,但只知道它,所以我可能是遗漏了什么).我的目标是能够执行以下操作:
class SchemaUpdateService {
public int calculateSomething(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
IStrategy strat = (IStrategy) ctx.getBean("mystrat");
}
}
Run Code Online (Sandbox Code Playgroud)
然后在beans.xml文件中映射相应的实现.我认为Grails支持这一点.有没有人有关于这将如何工作的任何文件?我真的只需要Spring IoC库吗?它会起作用吗?谢谢!
我最近了解了存储库和工作单元设计模式,并认为我将在新的EF4 MVC3项目中实现它们,因为抽象通常很好.
当我将它们添加到项目中时,我想知道果汁是否值得谚语挤压,给出以下内容:
我看到使用Repository模式的唯一真正好处是单元测试应用程序.抽象出数据存储似乎并不有用,因为我知道数据存储区不会改变,而且,EF4已经提供了一个非常好的抽象(我只是调用.AddObject(),它看起来像我在修改内存中集合,我只是调用.SaveChanges()已经提供了工作单元模式).
我是否应该费心实施这种抽象?我觉得必须有一些我遗漏的巨大好处,但我觉得我不需要沿着这条路走下去.我愿意相信; 有人可以提起诉讼吗?谢谢.
entity-framework unit-of-work repository-pattern asp.net-mvc-3
我知道之前已经问过“无法在没有调用 Looper.prepare() 的线程内创建处理程序”的一般问题,但我很难理解它在这种情况下如何应用。
我正在尝试在非 UI 线程中构造一个新的 CountDownTimer,我猜这是导致此错误的原因,但我真的不明白为什么需要在主线程中使用计时器。从我所见,它似乎有一个回调处理程序,需要在具有循环程序的线程中运行,非 UI 线程默认情况下没有。看来我的选择是:1)让这个非 UI 线程有一个 Looper 或 2)在我的 UI 线程上做一些奇怪的方法来构造这个计时器,这两种方法对我来说都很愚蠢。有人可以帮助我理解其中的含义吗?
另外,有没有人知道任何有用的链接可以阐明 Looper 和 MessageQueue?我没有很好地掌握它们,正如我确信我已经展示的那样。谢谢!
我一直在为Android编程取得了不错的成功,但我注意到的一件事是,当我得到NullPointerExceptions时,堆栈跟踪毫无价值.它们始终采用以下格式:
Thread [<1> main] (Suspended (exception NullPointerException))
ViewRoot.draw(boolean) line: 1431
ViewRoot.performTraversals() line: 1163
ViewRoot.handleMessage(Message) line: 1727
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4627
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 868
ZygoteInit.main(String[]) line: 626
NativeStart.main(String[]) line: not available [native method]
Run Code Online (Sandbox Code Playgroud)
通常堆栈跟踪会告诉您代码爆炸的位置,但我似乎总是得到最通用的代码.我错过了一些明显的东西吗 谢谢.
我有一个生产中的应用程序,最近有一个MySQL超时,所以我试图添加额外的参数到数据源,以防止这种情况.在1.3.7文档中,它显示我可以像这样添加属性值:
properties {
maxActive = 50
maxIdle = 25
minIdle = 5
initialSize = 5
minEvictableIdleTimeMillis = 60000
timeBetweenEvictionRunsMillis = 60000
maxWait = 10000
validationQuery = "/* ping */"
}
Run Code Online (Sandbox Code Playgroud)
但是,当我将其添加到我的开发数据源时,我收到以下错误:
ERROR Error executing bootstraps: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve …Run Code Online (Sandbox Code Playgroud) 我正在使用 MVC3 返回在代码中创建的临时文件。然后,我使用FileStreamResult该文件流式传输回客户端。但是,由于这是我不再需要的临时文件,我想清理该文件。我不知道该怎么做,因为我在流式传输时已经点击了 return 语句。谢谢。
public FileStreamResult Download()
{
string filename = Path.GetTempFileName();
using (FileStream stream = new FileStream(filename, FileMode.OpenOrCreate))
{
CreateFile(this.DataContext, stream);
}
using (FileStream outputStream = new FileStream(filename, FileMode.Open))
{
HttpContext.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xlsx");
return new FileStreamResult(outputStream,MimeTypeUtil.GetMimeType("xlsx"));
}
}
Run Code Online (Sandbox Code Playgroud) 我正在将Grails 1.3.7应用程序升级到2.0.3,我已经解决了大多数问题.但是,我有一些用于创建用户并将其保存到数据库的代码.代码不应该通过验证,因为我正在重用已经使用的用户名并且对用户名有唯一约束..validate()返回true,但是当user.save()使用MySql唯一约束错误调用时,代码实际上是炸弹.
应该抛出一个错误:
def submitSignup = {
def user = new User(params)
user.validate()
if (!user.hasErrors()) {
...
// This line bombs with the MySql unique constraint I would have expected .validate() to get
user.save()
}
}
Run Code Online (Sandbox Code Playgroud)
在User.groovy中:
static constraints = {
username(blank: false, unique: true);
...
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:我也升级到Acegi的Spring Security插件.我不认为这是相关的,但我想我会提到它.
我提出了一个问题的样本:https://github.com/skazzaks/Grails-Unique-Test 这使它看起来像一个bug.
我有一个标记为事务的Grails服务,它做了很多事情.
我正在为此方法添加代码,而不是在我逐步完成时获得我期望的结果:
.save()在整个方法完成之前,我有调用在MySQL后端无法看到的代码.这是我所期望的,因为服务方法是事务性的..save()可以在服务方法完成之前在MySQL中看到.我不明白这一点,我不明白这与1之间的差距.groovy.sql.Sql插入数据库.我猜这是在Grails事务处理之外,所以在方法结束之前提交这一事实是有道理的.我可以让Grails在交易中管理这个吗?请在我的假设中消除任何错误.这是一些相关的代码:
主要服务方式
public void updateDb(Date date) {
// Create the results
if (createResults() > 0) {
createA()
createB()
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个
A a = new a()
a.user = user
a.week = week
a.save()
Run Code Online (Sandbox Code Playgroud)
createB
userWeek = new UserWeek(user: user)
userWeek.number = 1
userWeek.save(flush: true)
Run Code Online (Sandbox Code Playgroud)
createResults
String insert = "insert into ..."
Sql sql = new Sql(dataSource)
sql.execute(insert)
Run Code Online (Sandbox Code Playgroud)
我添加flush:true了使它成为刷新,但我现在明白,只是刷新hibernate但实际上没有提交事务,因为它是事务性的.我究竟做错了什么?
我对单元测试很新.我正在构建一个ASP.NET MVC3应用程序(虽然我的问题似乎与语言无关)并且对基本测试感到困惑.
我想进行一个单元测试,确保我的"ValidatePassword"功能正常工作 - 它将接收用户名和密码,然后散列密码并查看它是否与数据库中用户的哈希值匹配.如果是,则返回true.问题是我使用的是模拟存储库,因此我必须在运行测试之前将用户添加到数据库中.我无法在我的测试设置中真正创建此用户,因为在我通过我正在测试的功能实际运行之前,我不知道加密密码是什么.答案是通过Hash函数运行一次,在我的测试中写下来,然后测试吗?
希望这很清楚.谢谢!
我是一般新的测试人员,正在研究Grails应用程序.
我想写一个测试,说"当调用此动作时,返回正确的视图".我不知道如何决定是否应该将这样的东西作为单元测试或集成测试.两种测试都会告诉我我想要什么 - 我该如何决定?
grails ×5
android ×2
unit-testing ×2
asp.net-mvc ×1
constraints ×1
datasource ×1
download ×1
grails-orm ×1
groovy ×1
hibernate ×1
java ×1
looper ×1
spring ×1
stack-trace ×1
transactions ×1
unit-of-work ×1
validation ×1