我正在尝试使用以下代码创建类javax.servlet.ServletException的实例
public class MyTroubleViewer {
public static void main(String[] args) {
javax.servlet.ServletException servletException = new javax.servlet.ServletException("Hello");
System.out.println(servletException.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
但我在创建时遇到异常:
Exception in thread "main" java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException
...
Run Code Online (Sandbox Code Playgroud)
Maven帮助我依赖:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我试图将一个服务注入我的bean,但它始终是null.我收到以下错误:WELD-001000错误解析属性userBean对基础null.
一些代码片段:
的index.xhtml
<h:body>
Hello from Facelets
#{userBean.name}
</h:body>
Run Code Online (Sandbox Code Playgroud)
userbean.java
package beans;
import Domain.User;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;
import service.UserService;
@Named
@SessionScoped
public class UserBean implements Serializable{
@Inject UserService service;
private User user;
public UserBean(){
this.user = service.find_user("foo");
}
public String getName(){
return "bar";
}
}
Run Code Online (Sandbox Code Playgroud)
UserService.java
package service;
import Domain.User;
import javax.ejb.Stateless;
import javax.inject.Named;
@Named
@Stateless
public class UserService {
public UserService(){}
public User find_user(String name){
return new User();
}
}
Run Code Online (Sandbox Code Playgroud) 我在一家小商店工作,我们有很多传统的Cobol代码,并采用了一种方法,使我们尽可能地减少分叉和分支.
对于给定的版本,我们有三个级别:
当需要一个程序时,首先在CUSTOMER中搜索它,然后在GROUP中搜索,最后在CORE中搜索.我们的给定应用程序调用许多程序,这些程序都按此顺序查找(在Windows下考虑exe文件和PATH).
我们还有Java程序与这些遗留代码进行交互,并且由于核心组客户查找机制并不能轻易地将其自身扩展到Java,因此每个客户都需要在CVS分支中增长,这需要过多的维护.Java部分和后端部分倾向于并行开发.
我被指派找出让两个世界相遇的方法.
从本质上讲,我们需要一个Java环境,它允许我们为每个版本提供一个包含源代码的代码库,我们可以轻松地选择一个组和一个客户,并为该客户提供应用程序,然后轻松切换到另一个代码集而那个顾客.
我想到的可能是每个核心,客户和组都有一个Eclipse项目的场景,然后使用项目集来选择我们需要的特定场景.我无法理解的问题是,我们将如何在CORE项目中创建健壮的代码,无论选择哪个组和客户,这些代码都能正常工作.一个Factory类,它知道要调用的传递的Class对象的哪个子类而不是每个新的?
其他人必须有类似的代码库管理问题.有经验的人分享?
编辑:上述问题的结论是,CVS需要替换为更适合同时处理多个分支的源代码管理系统以及将源从一个组件迁移到另一个组件同时保留历史记录.受到最近slf4j和logback迁移的启发,我们目前正在研究git,因为它可以很好地处理分支.我们也考虑过subversion和mercurial,但git似乎对单个位置,多分支项目更好.我在另一个问题上询问了Perforce,但我个人倾向于采用开源解决方案来解决这个问题.
编辑:经过一些更多的思考,我们发现我们的实际痛点是我们在CVS中使用分支,如果分支所有文件,CVS中的分支最容易使用!修改后的结论是,我们可以单独使用CVS,切换到java项目的森林,每个项目对应一个上面的级别,并使用Eclipse构建路径将它们绑定在一起,这样每个CUSTOMER版本都会引入相应的GROUP和CORE项目.我们仍然希望切换到更好的版本控制系统,但这是一个非常重要的决定,所以我们希望尽可能地延迟它.
编辑:我现在使用Google Guice 2.0进行了CORE-GROUP-CUSTOMER概念的概念验证实现 - @ImplementedBy标签正是我们所需要的.我不知道其他人做了什么?使用if到处都是?
编辑:现在我还需要这个功能的Web应用程序.Guice直到JSR-330到位.有版本经验的人吗?
编辑:JSR-330/299现在已经与基于JBoss Seam的JEE6参考实现Weld一起使用了,我已经用Weld重新实现了概念验证,并且可以看到如果我们在bean中使用@Alternative和.... xml我们可以得到我们想要的行为.即为CORE中的给定功能提供新的实现,而不改变CORE jar中的位.初步阅读Servlet 3.0规范表明它可能支持Web应用程序资源(而不是代码)的相同功能.我们现在将对实际应用程序进行初始测试.
我将完成核心Java课程,现在我必须转到Java EE方面.我非常困惑,我应该简单地使用Java EE 6,因为我有从头到尾轻松教授的书籍,一切都在那里.
或者我应该只从Spring开始?
因为我必须从头开始,所以我遵循良好的趋势,更加注重工作.
或者即使我只使用Java EE,然后如果我需要继续使用Spring,它将会很快,反之亦然.
此外哪里休眠他们之间的立场?我的意思是,如果我使用Java EE 6,我仍然需要Hibernate或Java EE 6,我不需要它.
如果我不使用Spring或Spring,我是否会处于劣势,可以使我的构建Web应用程序比核心Java EE/JSF框架更容易.
更新:在撰写本文之后一年,请参阅我关于此主题的博客文章:http://blog.ringerc.id.au/2012/07/java-ee-7-needs-improvements-in-app.html
...有关此主题的Java EE 7规划讨论的参考.
我主要编写了一个小型Java EE 6应用程序,并且正在使用适当的动态配置界面替换硬编码的首选项.
我不确定 - 或者更具体地说,在哪里 - 存储设置.这里必须有一些显而易见的,"标准"的方式来做到这一点的预期"只是工作"跨越各种框架和容器,但对我的生活,我不能找到它.
我想要的是一种加载和存储设置的简单方法,一种适用于不同应用服务器和操作系统的设置,不需要用户进行任何配置,并且实际上正常工作.Java Preferences API是理想的 - 但在Glassfish 3.1下似乎已经破解了.
存储配置的选项理论上包括:
这似乎是一个基本要求,在容器可能为您提供您可能需要的所有核心服务的环境中得到很好的照顾 - 但所有这些方法都存在问题.
glassfish中的一个错误呈现(1)不可行,并且在任何情况下,Glassfish Web管理员用户界面都没有任何方法来配置上下文参数,因此您必须使用`asadmin'和一些不太可爱的命令行语法来执行此操作.上下文参数只能通过ServletContext访问 - 在JSF2,JAX-RS和原始servlet等框架之间无法以一致的方式访问它 - 但至少Seam Servlet处理它.
什么似乎是GlassFish的另一个错误 是部署应用程序和Glassfish之间的库版本冲突(2)休息.首选项后端无法将首选项刷新到磁盘,因此重新启动应用程序服务器时,存储的首选项数据将丢失.Java Preferences API似乎也被认为是J2SE /桌面的东西,尽管它包含在Java EE 6规范中.
(3)可能有效 - 但是没有办法知道你的应用程序在文件系统上的读/写访问权限以及它应该在哪里.你不能使这个可配置,因为它成为一个鸡和蛋的问题.可以应用各种特定于平台的猜测,但在存在SecurityManager时会中断.
(4)会起作用,但它正在飞行.它要求运行JavaDB服务并强制用户确保正确配置应用服务器中的JDBC和池资源.对于一项简单的工作而言,这是一项庞大而复杂的工作,实体建模无论如何都不适合偏好存储,因为它主要是关键/价值结构.
(5)可以工作,但要求用户知道将配置文件放在哪里可以在各种不同的应用服务器下找到它.它还使应用程序很难提供任何类型的配置UI,因为它无法找到配置文件的本地路径或打开它进行写入,尤其是在存在SecurityManager的情况下.
(6)也可以工作,但强制用户在配置应用程序之前配置配置系统.毋庸置疑,考虑到部署应用程序和创建资源的相对复杂性,对于那些还不了解Glassfish/EE的用户来说,这并不会让我感到兴奋.
那么......你如何处理选项的配置和存储?您是否找到了一种方法,让您"只是这样做"而无需用户配置任何内容以允许您的应用程序存储其配置?
我打算用来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最终围绕类似结构的包装器对象?
EntityManager根据定义,它不是线程安全的.Servlets规范说,在非分布式环境中,如果没有实现SingleThreadModel,每个定义只有一个servlet实例.
因此,在Java EE中,当您EntityManager通过@PersistenceContextServlet的字段注入时- 它不是线程安全的:
public class MyServlet extends HttpServlet {
// Not thread-safe, should be using EMF instead.
@PersistenceContext
private EntityManager em;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的说,即使Spring bean的默认范围是单例,它EntityManager是线程安全的,因为Spring ThreadLocal用来绑定它的事务和EntityManager它?
上面的Servlets示例在Spring中仍然有效吗?它仍然不是线程安全的吗?
该ThreadLocal方法是否仅适用于Spring托管bean,而普通servlet不是其中之一?
据我所知,注入的是容器的责任EntityManager.在Glassfish Java EE实现中,应用程序服务器发现了@PersistenceContextas注入点.
它在Spring中看起来如何?Spring Framework是否负责发现这些注释或JPA实现者的责任?
我正在使用Java EE 6和Jboss AS7.1并尝试使用拦截器绑定(来自jboss站点的示例).
我有一个InterceptorBinding注释:
@InterceptorBinding
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface GeoRestrictedEquipment {
}
Run Code Online (Sandbox Code Playgroud)
拦截器:
@GeoRestrictedEquipment
@Interceptor
public class GeoRestrictedEquipmentInterceptor {
@EJB EquipmentDao equipmenttDao;
@EJB SecurityService securityService;
@AroundInvoke
public Object checker(InvocationContext ctx) throws Exception {
Integer id = (Integer) ctx.getParameters()[0];
Equipment equipment = equipmenttDao.findById(id);
GeoChecker.check(equipment.getSite(), securityService.getUser());
return ctx.proceed();
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个豆子:
@Stateless
@LocalBean
@SecurityDomain(Realm.NAME)
@RolesAllowed({ Roles.REGISTERED })
public class PumpService implements PumpServiceLocal {
@Override
@GeoRestrictedEquipment
public PumpInfos getPumpInfos(Integer pumpId) {
/* ... */
}
}
Run Code Online (Sandbox Code Playgroud)
但拦截器没有被调用......我从这个例子中错过了什么? …
我们假设我有一个Car类.在我的代码中,我想创建10辆汽车.Car类有一些@Inject注释依赖项.这样做的最佳方法是什么?
CDI有一个Provider接口,我可以使用它来创建汽车:
@Inject Provider<Car> carProvider;
public void businessMethod(){
Car car = carProvider.get();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果我没有CarFactory,它有一个带有@Produces注释的方法来创建汽车,那就不行了.尽管它反映了现实世界我无法在没有工厂的情况下制造汽车,但我宁愿不为所有东西编写工厂.我只是希望CDI容器像任何其他bean一样创建我的汽车.你怎么建议我创造那些汽车?