标签: java-ee-7

Intellij IDEA工件'XXXX:war explosion'具有无效扩展名

每次我对POM进行最小的更改时,Intellij会在Project Structure输出目录设置中删除我的爆炸工件的.war扩展名.这会导致Intellij的运行/调试配置出错:

神器'XXXX:战争爆炸'无效扩展.

为了解决这个问题,我必须手动覆盖Project Structure输出目录设置.每次我对POM进行最微小的更改时,我必须返回到Output目录设置并手动将".war"附加到Output目录设置的末尾.这变得非常古老和令人沮丧.

我必须改变这个:

E:\工作区\ enterp \程序\目标\应用

对此:

E:\工作区\ enterp \程序\目标\ application.war

如果我按如下方式手动设置Maven WAR插件outputDirectory配置,这根本没有帮助:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>${maven.war.plugin.version}</version>
    <configuration>

        <!-- Output directory of artifact:war exploded keeps losing the .war extension -->
        <outputDirectory>${project.build.directory}.war</outputDirectory>

    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

编辑:

这是完整的构建配置:

    <build>
    <!-- Maven will append the version to the finalName (which is the name
        given to the generated war, and hence the context root) -->
    <finalName>${project.artifactId}</finalName>

    <plugins>
        <!-- Compiler plugin enforces Java 1.6 compatibility and activates annotation
            processors -->
        <plugin> …
Run Code Online (Sandbox Code Playgroud)

intellij-idea maven java-ee-7 intellij-13

21
推荐指数
2
解决办法
3万
查看次数

JAX-RS客户端:ResponseProcessingException处理

一些重载的调用请求方法,例如:get()post(Entity<?> entity)(还有其他)SyncInvoker返回一个Response对象,而不是解组的内容.

我注意到,在get()没有文档的情况下ResponseProcessingException,而其他方法,如所有3个重载 post方法,可能会抛出一个ResponseProcessingException.

我知道这ResponseProcessingExceptionRuntimeException继承自的ProcessingException,但我仍然会解释这意味着该get()方法不会抛出ResponseProcessingException.

它是否正确?怎么样ClientResponseFilter?为什么比其他的呼叫请求方法(行为不同的行为put,post......)?

另外,Javadoc用于抛出的方法ResponseProcessingException说:

在接收到的HTTP响应的处理失败的情况下(例如,在过滤器中或在将响应实体数据转换为特定Java类型的实例期间).

那个部分:

或者在将响应实体数据转换为特定Java类型的实例期间

在这里似乎是错误的,因为该readEntity方法不应该被调用:

https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e9915

这是复制和粘贴文档错误吗?

不过,我猜过滤器是一个有效的案例.

java jax-rs jersey java-ee java-ee-7

21
推荐指数
1
解决办法
2382
查看次数

Java EE 7:如何将EJB注入WebSocket ServerEndpoint?

总结我失败的项目:我的@ServerEndpoint类与beans.xml文件一起打包在WAR中.我的WAR反过来打包在EAR中,这个EAR文件被部署到内部使用Tyrus的GlassFish 4服务器上.

应该可以吗?

WebSocket 规范说:

在Java EE平台中运行的Websocket端点必须具有完全依赖注入支持,如CDI规范中所述.要使用javax.inject支持字段,方法和构造函数注入,需要Java EE平台的Websocket实现部分.将注释注入所有websocket端点类,以及为这些类使用拦截器.

我唯一能理解的是,将一个Enterprise JavaBean注入WebSocket应该不是火箭科学.然而,对我而言,无论我做什么,都无法奏效.我觉得最直观的是,只需要在服务器端点实例字段前加上@EJB或者@Inject注释,但这些注释中没有一个可以工作.变量将为null.

已经是一个已知的问题?

一个互联网消息来源说,"由于一个错误",他必须使用构造函数注入.我看到他已将注释添加@Named到服务器端点.我使用了着名的复制粘贴模式,完成了他所做的事情,无论有没有@Named注释,它仍然无法正常工作.事实上,我的@Inject注释构造函数甚至从未被调用过!

Tyrus 用户指南说,可以将任何着名的会话bean声明注释与服务器端点(@Stateful,@Stateless@Singleton)混合在一起.所以我做了,仍然没有发生注射.如果我使用注释@Inject或@EJB并不重要.

这很奇怪,因为" Java EE 7开发人员手册 "一书声称在第27页和第28页有一个基于相同方法的工作示例.作者Peter Pilgrim注释了他的服务器端点@Stateless.然后他用@Inject它做注射.他说:

在Java EE 7中,我们还必须将[我们的服务器端点]声明为带有@Stateless的无状态EJB,以便将[另一个EJB]作为依赖项注入.(这是Java for WebSocket 1.0规范的结果.)请注意,我们可以使用CDI中的@ javax.annotation.Inject.

好吧所以他说我们必须使用@Stateless注释,并且"注意"可以使用@Inject.对我来说,听起来完全奇怪,我们"必须"在服务器端点上使用@Stateless注释,根据规范,除了无状态(!)之外的其他所有内容.我在互联网上的其他地方读到使用@Inject代替@EJB应该是一个修复.彼得"注意到""我们可以使用"@Inject,但它闻起来很腥,好像他从未让@EJB工作,现在试图逃避责任.

好吧,不管是什么原因("bug"或"规范的结果"),我无法使用我的依赖注入来处理我在端点类本身或实例字段上使用的任何生动的注释混合.

终极修复

是以编程方式使用JNDI查找,但它看起来很丑,应该避免.

dependency-injection ejb websocket java-ee-7 tyrus

20
推荐指数
1
解决办法
8450
查看次数

加载没有N + 1 Cartesian Product with JPA和Hibernate的递归对象图

将项目从Ibatis转换为JPA 2.1时,我遇到了一个问题,我必须为一组对象加载一个完整的对象图,而不是出于性能原因而没有按N + 1选择或使用笛卡尔积.

用户查询将产生List <Task>,我需要确保在返回任务时,它们已填充所有属性,包括,,依赖项属性.首先让我解释一下所涉及的两个实体对象.

任务是层次结构的一部分.它可以有一个父任务,也可以有子.任务可以依赖于其他任务,由'dependencies'属性表示.任务可以有许多属性,由properties属性表示.

尽可能简化了示例对象,并删除了样板代码.

@Entity
public class Task {
    @Id
    private Long id;

    @ManyToOne(fetch = LAZY)
    private Task parent;

    @ManyToOne(fetch = LAZY)
    private Task root;

    @OneToMany(mappedBy = "task")
    private List<TaskProperty> properties;

    @ManyToMany
    @JoinTable(name = "task_dependency", inverseJoinColumns = { @JoinColumn(name = "depends_on")})
    private List<Task> dependencies;

    @OneToMany(mappedBy = "parent")
    private List<Task> children;
}

@Entity
public class TaskPropertyValue {
    @Id
    private Long id;

    @ManyToOne(fetch = LAZY)
    private Task task; …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa lazy-loading java-ee-7

16
推荐指数
1
解决办法
6129
查看次数

来自注释处理器的org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor支持的源版本RELEASE_6小于source1.7

我有一个在以下环境中运行的企业应用程序.

  • Mojarra 2.2.7
  • PrimeFaces 5.0决赛
  • PrimeFaces Extension 2.0决赛
  • OmniFaces 1.8.1
  • EclipseLink 2.5.2具有JPA 2.1
  • GlashFish 4.0
  • NetBeans IDE 8.0
  • JDK 1.7

我在所有三个模块(Java EE模块,EJB模块和WAR模块)project.properties下的文件中将源级别从1.6更改为1.7,nbproject以支持Java EE 7.它不是 Maven项目.

  • j2ee.platform=1.7
  • javac.source=1.7
  • javac.target=1.7

早些时候他们都是1.6.


完成这些更改后,清除项目时会出现以下警告.

警告:注释处理器'org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor'支持的源版本'RELEASE_6'小于-source'1.7'

我正在使用EclipseLink元模型生成器1.3.0 final来生成静态元模型.

除了将源级别降级到1.6之外,有没有办法摆脱这个警告?是否与此警告不兼容?


更新:

此警告在EclipseLink 2.6.1(自2015年10月15日星期四起可用)中不再可再现,并且捆绑包提供相应的元模型生成器org.eclipse.persistence.jpa.modelgen_2.6.1.v20150916-55dc7c3.jar.

目前在GlassFish 4.1/Java EE 7上使用EclipseLink 2.6.1(JPA 2.1)和JDK 8u45进行了测试.

我认为它是固定的.

jpa eclipselink java-ee java-ee-7 jpa-2.1

14
推荐指数
1
解决办法
3万
查看次数

如何获取现有的websocket实例

我正在开发一个使用Websockets(Java EE 7)的应用程序,以异步方式向所有连接的客户端发送消息.每当创建新文章(我的应用程序中的参与模式)时,服务器(Websocket端点)都应发送这些消息.

每次建立与websocket端点的连接时,我都会将相应的会话添加到列表中,我可以在外部访问该列表.

但我遇到的问题是,当我访问这个创建的websocket端点时,所有客户端都从外部连接(任何其他业务类),我得到了现有的实例(如单例).

那么,请你建议我一个方法,我可以得到一个现有的websocket端点实例,因为我无法创建它作为新的MyWebsocketEndPoint()因为它将由websocket内部机制创建,只要客户端的请求是接收.

对于参考:

private static WebSocketEndPoint INSTANCE = null;

public static WebSocketEndPoint getInstance() {
if(INSTANCE == null) {
// Instead of creating a new instance, I need an existing one
    INSTANCE = new WebSocketEndPoint ();
}
        return INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

java singleton instance websocket java-ee-7

13
推荐指数
2
解决办法
2万
查看次数

与maven一起使用org.wildfly.bom和org.jboss.spec与Java EE7的区别

我正在开发一个新项目,它将使用JavaF 7和WildFly,但我仍然对我应该使用哪些maven依赖项感到困惑.我发现这两个组显然可以使用:org.wildfly.bom和org.jboss.spec

他们在项目中使用以下预定义工件(在https://repository.jboss.org/nexus/index.html#welcome中搜索):

org.wildfly.bom:

  • 的jboss-JavaEE的-7.0与 - 所有
  • 的jboss-JavaEE的-7.0-与冬眠
  • 的jboss-JavaEE的-7.0-与工具
  • JBoss的-BOM父
  • 的jboss-JavaEE的-7.0-与-交易
  • 的jboss-JavaEE的-7.0-与安全
  • 的jboss-JavaEE的-7.0-与-RestEasy的
  • 的jboss-JavaEE的-7.0-与-的Infinispan
  • 的jboss-JavaEE的-7.0-与-Hibernate3的

org.jboss.spec:

  • 的jboss-JavaEE的-ALL-7.0
  • 的jboss-的JavaEE的Web-7.0
  • 的jboss-JavaEE的-7.0

此外,我已经意识到我可以使用org.jboss.spec看到依赖关系层次结构,但不能看到wildfly.bom.所以,我的问题是有什么区别?你建议哪一个?

jboss dependencies maven java-ee-7 wildfly

13
推荐指数
1
解决办法
3204
查看次数

Quartz vs Java EE 7调度程序


我是一个java EE开发人员,直到现在使用像Quartz这样的框架来安排任务.我可以看到Java EE 7具有ManagedScheduledExecutorService来安排单个或重复任务.由于我从未在实际项目中使用过这个新功能,我想知道当你有一个可移植的方法时,使用Quartz(或其他)还有什么优势吗?
谢谢!

quartz-scheduler java-ee java-ee-7

11
推荐指数
1
解决办法
3807
查看次数

错误:找不到类型的验证程序:java.time.LocalDate

我正在开发一个使用bean验证的项目(Hibernate Validator 5.1.3.Final).我的bean有一个带@Past注释的属性.

@Past(message = "A data deve estar no passado.")
private LocalDate dataAbertura;
Run Code Online (Sandbox Code Playgroud)

但是,当验证发生时,我得到以下异常:

21:46:12,424 ERROR [io.undertow.request] (default task-35) UT005023: Exception handling request to /financeiro/clientes/pessoafisica: javax.servlet.ServletException: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.time.LocalDate.
    at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:127) [vraptor-4.1.4.jar:]
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final] …
Run Code Online (Sandbox Code Playgroud)

java java-ee hibernate-validator bean-validation java-ee-7

11
推荐指数
1
解决办法
1万
查看次数

如何使用Java EE 7 WebSockets实现对客户端的推送?

我浏览了很多Web Socket示例,演示幻灯片,它们主要集中在客户端发起客户端 - 服务器通信的相当简单的场景中.

我对另一个场景感兴趣,这似乎同样实用:纯服务器推送到客户端.

示例我想到的是一个更新网站上股票价值的应用程序.想象一下,有一个外部系统股票交易系统,它为每个订阅的股票价值变化发送JMS消息.

我想知道如何将这样的传入JMS事件转换为服务器推送,并从Java EE 7的角度高效地和惯用地转换它.

据我所知,我应该编写一个Web套接字端点

@ServerEndpoint("/demo")
public class WSEndpoint {
  private static final Logger LOG = Logger.getLogger(WSEndpoint.class);

  @OnMessage
  public void onMessage(String message, Session session) {
    LOG.info("Received : " + message + ", session:" + session.getId());
  }

  @OnOpen
  public void open(Session session) {
    LOG.info("Open session:" + session.getId());         
  }

  @OnClose
  public void close(Session session, CloseReason c) {
    log.info("Close session:" + session.getId());
  }
}
Run Code Online (Sandbox Code Playgroud)

当我从前端收到消息时,一切都很简单,我可以在@OnMessage方法中做任何我喜欢的事情.但在我的例子中,我不会从客户端收到任何消息,我会从某个外部系统获得一个事件.

有几种方法.例如,我可以在@OnOpen方法中创建一个线程,如本博客所示.实际上,这种方法可能会显示出一个缺点,因为对于每个客户端,我都需要创建一个新的,可能很长的生命线程.

使用选择器的NIO通道可以做得更好,但这需要某种"手工制作"的通道管理.可行,但相当繁琐.

另一个解决方案是ping其他系统进行更新,但同样会有点难看.另外,我也不确定是否@OnOpen要以这种方式使用方法.

理想情况下,传入的JMS消息将触发Web Socket推送到客户端.任何想法如何很好地实现这样的事情?

java java-ee websocket java-ee-7

10
推荐指数
1
解决办法
7131
查看次数