我有一个eclipse项目结构,看起来像这样:
eclipse
project a
project b
Run Code Online (Sandbox Code Playgroud)
所有这些项目都是Maven项目.项目B是Eclipse WTP项目,包含项目A作为依赖项.我正在使用m2eclipse插件.
当我将Project B部署到Tomcat(全部来自Eclipse中)时,它总是抛出错误,说它无法从Project A中找到类.我可以解决这个问题的唯一方法是在Eclipse中关闭 Project A并执行mvn install命令,所以在这一点上,项目A被视为任何其他依赖项.
我希望不必再次重新打开,然后每当我对其进行更改时关闭项目A(这在此阶段经常发生).
我已经尝试将Project A添加到Project B的Build Path中,但是这似乎并没有成功.同样,它只有在我在eclipse中关闭项目时才有效,所以它被视为普通的maven依赖.
仅供参考我正在使用Helios版Eclipse.项目B是一个Spring项目,所以Tomcat在导入所有bean等时自然会失败.
有没有人有什么建议?非常感谢.
在设计我的类时,我目前正在努力解决循环依赖问题.
自从我读到有关贫血领域模型(我一直在做的事情)以来,我一直在努力摆脱创建只是"吸气剂和孵化器"的域对象并回到我的OO根源.
但是,下面的问题是我经常遇到的问题,我不确定应该如何解决它.
假设我们有一个Team类,有很多玩家.这是什么运动并不重要:)球队可以添加和删除球员,就像球员离开球队并加入另一支球队一样.
所以我们有一个团队,其中有一个玩家列表:
public class Team {
private List<Player> players;
// snip.
public void removePlayer(Player player) {
players.remove(player);
// Do other admin work when a player leaves
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们有了Player,它引用了Team:
public class Player {
private Team team;
public void leaveTeam() {
team = null;
// Do some more player stuff...
}
}
Run Code Online (Sandbox Code Playgroud)
可以假设这两种方法(删除和离开)都具有特定于域的逻辑,只要团队移除玩家并且玩家离开团队就需要运行这些逻辑.因此,我首先想到的是当一个团队踢一个玩家时,removePlayer(...)也应该调用player.leaveTeam()方法......
但是如果玩家正在推动出发 - 如果leaveTeam()方法调用team.removePlayer(this)该怎么办?不是没有创造无限循环!
在过去,我刚刚将这些对象设为"哑"POJO,并让服务层完成工作.但即使是现在我仍然存在这个问题:为了避免循环依赖,服务层仍然将它们连接在一起 - 即
public class SomeService {
public void leave(Player player, …Run Code Online (Sandbox Code Playgroud) 更新已添加的jsfiddle - 请参阅帖子的底部
我目前有一个功能可以重新启用屏幕上所有禁用的字段.虽然它运行得非常快(根据Firebug profiler <1ms),我正在整理屏幕中的所有Javascript,并认为这个特殊功能似乎有点多余:
function enableDisabledFields() {
$('[disabled]').each(function(i) {
$(this).removeAttr('disabled');
});
}
Run Code Online (Sandbox Code Playgroud)
我的印象是这3行可以替换如下,我预计如果不比至少相同的性能更好.
function enableDisabledFields() {
$('[disabled]').removeAttr('disabled');
}
Run Code Online (Sandbox Code Playgroud)
显然我错了.第一个表现要好得多,我不太明白为什么.即使添加额外的选择器,例如:输入也没有区别(实际上会使情况变得更糟).
任何人都可以解决我的困惑吗?谢谢.
编辑我应该补充说我们正在使用旧版本的jQuery - 1.3.1我相信.
Edit2这里有一些jsFiddle链接.请记住,我可能误解了Firebug的剖析器(我认为似乎是这种情况).
编辑:我已经查看了Spring 3的@ExceptionHandler注释,并将其与下面的选项1相结合,看起来是一个非常干净的解决方案.
我也发现这是一个很好的阅读:http://blog.decaresystems.ie/index.php/2006/04/07/difficult-choices-in-handling-exceptions-in-enterprise-java-applications/
我一直在使用Spring MVC框架开发一段时间,但是我正在努力想出一个"好的"方法来将服务层中引发的错误传递回JSP.
基本上,我不认为业务逻辑(超出"此字段是强制性的")应该在Validators中,尤其是需要访问DB的任何逻辑.所以,我一直在做的是在服务层中放置更复杂的验证和业务逻辑.
例如,假设我有一个允许用户购买图书的页面.他们在JSP上单击"购买",控制器调用服务使其全部发生......现在,如果服务看到他们没有足够的资金会发生什么 - 我如何将这个消息发送回JSP这么好的一点点可以向用户显示"资金不足"消息?我考虑过两种方式而且我不确定哪种方法是正确的......
选项1:例外
我认为的第一种方法是在服务层中引发异常,将其捕获到控制器中并向BindingResult添加消息.
服务:
public void pay(Book book) throws InsufficientFundsException {
// Some logic goes here, which ends up throwing the above exception
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public ModelAndView(@ModelAttribute("book") Book book, BindingResult errors) {
try {
pay(book);
} catch (InsufficientFundsException ex) {
errors.reject("insufficient.funds");
}
return new ModelAndView(blahblahblah);
}
Run Code Online (Sandbox Code Playgroud)
选项2:将BindingResult传递给Service层
第二种方法是将BindingResult对象传递给服务层并针对它引发进一步的错误.
服务:
public void pay(Book book, BindingResult errors) {
// User has insufficient funds, so... …Run Code Online (Sandbox Code Playgroud) 在我研究 Java API 的过程中,我遇到过 impl 包和内部包。到目前为止,我从未真正考虑过其中的区别 - 与所有企业级 Java 应用程序一样,我认为它们只是意味着“此处的实际实现;您(API 用户)应该真正使用该接口。走开。”
对 Stack Overflow 的一点挖掘似乎表明内部包至少可以有一些安全措施。
那么区别是什么呢?我不认为这是一个品味问题,因为我已经看到过两者都有的 API。
我的问题很简单,在服务器重启(我自己的本地Tomcat)之后,Spring Security主体对象将重新填充每个字段(用户名,密码,电子邮件,用户类型等),但用户ID字段除外.
我有以下User对象,它实现了Spring的UserDetails对象,并且还扩展了我自己的基础对象类:
public class User extends BaseDomainObject implements UserDetails {
private String username;
private String emailAddress;
private String password;
// ... etc ... /
}
Run Code Online (Sandbox Code Playgroud)
(仅供参考,User类有一个构造函数,它接受除ID之外的所有字段(由hibernate偷偷注入).此对象上没有setter.不确定这是否重要.)
用户ID字段位于BaseDomainObject中:
class BaseDomainObject {
protected Long id;
public Long getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
成功登录后,主体将填充上述用户详细信息(包括ID),一切都很满意.这由以下日志输出(其中包含User [id,username,emailAddress]形式的上述User类的toString表示)确认:
2011-07-26 11:50:25,188 DEBUG [org.springframework.security.web.context.HttpSessionSecurityContextRepository] - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: 'org.springframework.security.core.context.SecurityContextImpl@5e8fac5a: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@5e8fac5a: Principal: User[1,test,test@test.com]; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@255f8: RemoteIpAddress: 0:0:0:0:0:0:0:1%0; SessionId: 450FFF87C04098ECC58C2E0829D21D69; Granted Authorities: ROLE_USER, ROLE_CUSTOMER'
Run Code Online (Sandbox Code Playgroud)
但是,在服务器重新启动后,相同的日志输出如下所示:
2011-07-26 …Run Code Online (Sandbox Code Playgroud) 如果这是一个愚蠢的问题我很抱歉,但我找不到任何有关此问题的信息.
我想在我的应用程序视图中使用JSP标记(而不是播放'标记') - 特别是用于格式化的Joda Time JSP标记.
我无法弄清楚如何调用这些标签 - 在JSP中我只需要导入taglib然后关闭.
<%@taglib prefix="joda" uri="http://www.joda.org/joda/time/tags" %>
Run Code Online (Sandbox Code Playgroud)
我是否遗漏了一些简单的内容 - 如何在Play视图定义中执行此操作?目前我的taglib调用呈现为HTML.我知道Play的视图内容是基于Groovy的 - 我也试过在那里找到相关信息但是没有成功.
谢谢.
编辑对于它的价值,我开始怀疑我在这里误解了这种情况 - 我是否认为Play模板引擎与JSP 无关并且是一种替代而不是扩展?