我现在正在阅读J2EE 1.4规范,有很多我不明白的术语.这是来自容器的规格:
容器为J2EE应用程序组件提供运行时支持.容器为应用程序组件提供底层J2EE API的联合视图.J2EE应用程序组件从不与其他J2EE应用程序组件直接交互.他们使用容器的协议和方法相互交互并与平台服务进行交互.在应用程序组件和J2EE服务之间插入容器允许容器透明地注入由组件的部署描述符定义的服务,例如声明式事务管理,安全性检查,资源池和状态管理.
由于我来自Web开发世界,我无法理解,这究竟是做什么的,以及容器的用途是什么.提供运行时支持是什么意思?它如何使J2EE在术语或可扩展性方面成为更好的系统?
我正在尝试zip多个序列来形成一个长元组:
val ints = List(1,2,3)
val chars = List('a', 'b', 'c')
val strings = List("Alpha", "Beta", "Gamma")
val bools = List(true, false, false)
ints zip chars zip strings zip bools
Run Code Online (Sandbox Code Playgroud)
我得到了什么:
List[(((Int, Char), String), Boolean)] =
List((((1,a),Alpha),true), (((2,b),Beta),false), (((3,c),Gamma),false))
Run Code Online (Sandbox Code Playgroud)
但是我想得到一系列扁平元组:
List[(Int, Char, String, Boolean)] =
List((1,a,Alpha,true), (2,b,Beta,false), (3,c,Gamma,false))
Run Code Online (Sandbox Code Playgroud)
我现在能做到:
List(ints, chars, strings, bools).transpose
Run Code Online (Sandbox Code Playgroud)
但它返回的是弱类型List[List[Any]].我也可以做(ints, chars, strings).zipped,但zipped只适用于2元组和3元组.
有没有办法轻松地压缩(任意)数量的等长序列?
我的方法如下
def myMethod(myDouble: Double): Double = myDouble match {
case Double.NaN => ...
case _ => ...
}
Run Code Online (Sandbox Code Playgroud)
IntelliJ调试器显示NaN但在我的模式匹配中没有获取.有可能我省略的情况
我一直在使用带有spring-data的RESTful web服务.几天前,发布了一个特殊的spring-data jpa REST框架.
现在我注意到在这个框架中使用@Version的能力.此版本是由自己生成还是您需要手动执行此操作?
它可以自己使用@Version吗?(这样我就不必将任何内容更改为现有的存储库/域等...)
我是否需要做一些额外的配置才能使用@Version?
如果我在web.xml文件中没有指定以下内容:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
Run Code Online (Sandbox Code Playgroud)
什么是我的默认会话超时?(我正在运行Tomcat 6.0)
我知道我们可以在hiveQL(hive.sql脚本)中使用' - '进行单行注释,但有没有办法进行多行注释?我需要下面的东西
/* This sentence is
a comment */
Run Code Online (Sandbox Code Playgroud) 在我的一个项目中,我有两个"数据传输对象"RecordType1和RecordType2,它们继承自RecordType的抽象类.
我希望两个RecordType对象在"process"方法中由同一个RecordProcessor类处理.我的第一个想法是创建一个通用的流程方法,该方法委托给两个特定的流程方法,如下所示:
public RecordType process(RecordType record){
if (record instanceof RecordType1)
return process((RecordType1) record);
else if (record instanceof RecordType2)
return process((RecordType2) record);
throw new IllegalArgumentException(record);
}
public RecordType1 process(RecordType1 record){
// Specific processing for Record Type 1
}
public RecordType2 process(RecordType2 record){
// Specific processing for Record Type 2
}
Run Code Online (Sandbox Code Playgroud)
我读过Scott Meyers在Effective C++中写了以下内容:
"任何时候你发现你自己编写的形式的代码'如果对象是T1类型,那么做一些事情,但如果它是T2类型,那么做一些其他的事情,'打自己."
如果他是对的,显然我应该打自己.我真的没有看到这是多么糟糕的设计(除非当然有人将RecordType子类化并添加到RecordType3而不向处理它的通用"Process"方法添加另一行,从而创建一个NPE),以及我能想到的替代方案涉及将特定处理逻辑首当其冲地放在RecordType类本身中,这对我来说真的没有多大意义,因为理论上我可以对这些记录执行许多不同类型的处理.
有人可以解释为什么这可能被视为糟糕的设计并提供某种替代方案,仍然负责将这些记录处理到"处理"类?
更新:
return null以throw new IllegalArgumentException(record);我正试图进入JAX-RS.我的项目jdk设置为1.7.03.是否必须为JAX-RS(javax.ws.rs)定义注释?如果没有,我可以在哪里找到它们?
我有一个无状态的豆类似于:
@Stateless
public class MyStatelessBean implements MyStatelessLocal, MyStatelessRemote {
@PersistenceContext(unitName="myPC")
private EntityManager mgr;
@TransationAttribute(TransactionAttributeType.SUPPORTED)
public void processObjects(List<Object> objs) {
// this method just processes the data; no need for a transaction
for(Object obj : objs) {
this.process(obj);
}
}
@TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(Object obj) {
// do some work with obj that must be in the scope of a transaction
this.mgr.merge(obj);
// ...
this.mgr.merge(obj);
// ...
this.mgr.flush();
}
}
Run Code Online (Sandbox Code Playgroud)
通常用法是客户端将调用processObjects(...),它实际上不与实体管理器交互.它完成了它需要做的事情,并为每个要处理的对象单独调用进程(...).进程的持续时间(...)相对较短,但是processObjects(...)可能需要很长时间来运行所有内容.因此我不希望它维持一个开放的交易.我确实需要单独的进程(...)操作才能在自己的事务中运行.这应该是每次通话的新交易.最后,我想保持选项打开,让客户端直接调用进程(...).
我尝试了许多不同的事务类型:从不,不支持,支持(在processObjects上)和required,需要new(on process)但每次调用merge()时都会得到TransactionRequiredException.
我已经能够通过将方法分成两个不同的bean来使它工作:
@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 …Run Code Online (Sandbox Code Playgroud)