我正在使用Spring MVC 3.0创建一个新的Java webapp,并希望尽可能多地使用标准的Java EE 6.(我在使用Glassfish 3.1.1.)真正的驱动程序是想要使用MVC Web框架而不是JSF.
所以我正在寻找将EJB注入Spring控制器的最佳方法.我取得了一些成功,但我对它的外观并不满意,我希望找到更好的方法.
通过JNDI查找EJB,这很有效:
// EJB
@Stateless
public class Service {
@PersistenceContext(name="MAIN")
private EntityManager em;
public void doSomething() { .... }
}
// Spring
@Controller
public class HomeController {
@EJB(mappedName="java:global/springtest/Service")
private Service service;
// controller methods use service
}
Run Code Online (Sandbox Code Playgroud)
但是我对控制器中需要@EJB注释的"mappedName"感到不满意.
有一个更好的方法吗?
但好消息是,我可以在EJB和Spring bean中使用相同的@Inject注释,唯一的区别是哪个框架正在创建对象并进行注入.
我打算用来EJBContext将一些属性从应用程序层(特别是消息驱动的bean)传递给持久性生命周期回调,它不能直接注入或传递参数(EclipseLink中的会话监听器,实体生命周期回调等),并且该回调正在获得EJBContext通过JNDI.
这看起来有效,但有没有任何隐藏的陷阱,比如线程安全或对象寿命,我错过了?(假设传递的属性值是不可变的,如String或Long.)
示例bean代码
@MessageDriven
public class MDB implements MessageListener {
private @Resource MessageDrivenContext context;
public void onMessage(Message m) {
context.getContextData().put("property", "value");
}
}
Run Code Online (Sandbox Code Playgroud)
然后是使用EJBContext的回调
public void callback() {
InitialContext ic = new InitialContext();
EJBContext context = (EJBContext) ic.lookup("java:comp/EJBContext");
String value = (String) context.getContextData().get("property");
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,我能确定contextData地图内容只对当前的调用/线程可见吗?换句话说,如果两个线程同时运行该callback方法,并且都EJBContext从JNDI 查找,它们实际上是获得不同的contextData地图内容?
而且,这实际上是如何工作的 - EJBContext从JNDI查找返回的是ThreadLocal最终围绕类似结构的包装器对象?
为什么这部分代码失败:
Integer.parseInt("11000000000000000000000000000000",2);
Exception in thread "main" java.lang.NumberFormatException: For input string: "11000000000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)
据我所知,Integer是32位值.上面代码中的0和1的数量是32.如果有31个代码可以工作.为什么会这样?
AWS Lambda 中全局变量的范围或生命周期是多少?
例如,如果我这样做:
cache = {}
def lambda_handler(event, context):
# do something with "cache"
# do something else with "cache"
Run Code Online (Sandbox Code Playgroud)
cache每次调用都会初始化一次(每次 Lambda 执行都有新的进程),还是一旦初始化此模块,它是否会重新用于多次调用?
有什么办法可以用AccessController.doPrivilegednew AccessControlContext来限制对类/方法的访问吗?我想有一个子程序可以调用不受信任的代码而无需访问触摸文件系统或打开套接字.
具体用例是允许最终用户提供可以使用有限权限执行的代码或脚本片段(例如,Javascript或Groovy).
我正在寻找的是类似普通安全策略文件的东西,其范围限于用户提供的代码而不是整个JVM.
什么可能导致这样的事情:

该行def result显示只有2/6分支覆盖,即使它没有分支,而下面的行,实际上有条件,是可以的.
这是怎么回事?我验证cobertura.ser了构建之间的清理工作.
我正在学习postgresql.但是,我对表,视图和物化视图有点困惑.我理解基本定义和概念.但有时候,我很难做出我应该创建表格,视图或物化视图的决定.有人会分享一些如何正确应用它的经验吗?一个人的优点和缺点是什么?谢谢
想知道是否有一种方法可以sql.eachRow像生成器一样使用它,以便在需要Collection或Iterator的DSL上下文中使用它.我正在尝试使用的用例是流式JSON生成 - 我正在尝试做的是:
def generator = { sql.eachRow { yield it } }
jsonBuilder.root {
status "OK"
rows generator()
}
Run Code Online (Sandbox Code Playgroud) 完成以下任务的最佳方法是什么?
我能想到的几个方法可能会工作.还有其他什么,哪个最好?
使用@TransactionManagement(type=BEAN)和UserTransaction,并在捕获异常后显式回滚.例如:
catch (Exception e) {
e.printStackTrace();
utx.rollback();
}
使用容器管理的事务,指定@TransactionAttribute(value=NOT_SUPPORTED)上onMessage然后委托DB活动与一个单独的方法@TransactionAttribute(value=REQUIRED).
保留事务处理,并在服务器中重新配置重试属性.我正在使用Glassfish 3.1.1,我不确定如何设置它.
保留所有内容并明确检查消息是否在正文中重新发送,onMessage如果重新发送则退出.(message.getJMSRedelivered()?)
什么运作良好?有没有一种标准/最佳实践方法来处理这个问题?
我有一个@RequestScoped CDI bean,我想把它变成一个EJB来获取声明式事务.(我在EJB 3.1,Java EE 6上)
目前,我在子例程之间传递状态,假设实例仅用于单个请求.如果我@Stateless现在补充说假设会改变.
例如,我想做类似的事情
@Stateless
@Named
@RequestScoped
public class Foo {
private String var1; // can't use instance vars in @Stateless?
private String var2;
public void transactionForRequest() {
var1 = value;
var2 = value;
....
subroutine();
}
}
Run Code Online (Sandbox Code Playgroud)
我认为以上不起作用 - 这是正确的吗?
我正在考虑两种选择:
EJBContext.getContextDatamap替换实例变量.哪个更好?还有其他一些我没想到的选择吗?(除了等待Java EE 7或切换到Spring.:-))