小编Pat*_*ner的帖子

如何使用Streams平均BigDecimals?

我想采取以下方法:

public BigDecimal mean(List<BigDecimal> bigDecimals, RoundingMode roundingMode) {
    BigDecimal sum = BigDecimal.ZERO;
    int count=0;
    for(BigDecimal bigDecimal : bigDecimals) {
        if(null != bigDecimal) {
            sum = sum.add(bigDecimal);
            count++;
        }
    }
    return sum.divide(new BigDecimal(count), roundingMode);
}
Run Code Online (Sandbox Code Playgroud)

并使用Streams api更新它.这是我到目前为止所得到的:

public BigDecimal average(List<BigDecimal> bigDecimals, RoundingMode roundingMode) {
    BigDecimal sum = bigDecimals.stream()
        .map(Objects::requireNonNull)
        .reduce(BigDecimal.ZERO, BigDecimal::add);
    long count = bigDecimals.stream().filter(Objects::nonNull).count();
    return sum.divide(new BigDecimal(count), roundingMode);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有两次流式传输的情况下做到这一点(第二次获得计数)?

java collections bigdecimal java-8 java-stream

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

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万
查看次数

如何在maven-war-plugin中正确设置清单类路径

我已经使用maven-ear-plugin和maven-war-plugin以及maven-ejb-plugin成功部署并运行打包为EAR的应用程序到Jboss AS7.

.
|-- META-INF
|   |-- application.xml
|   |-- MANIFEST.MF
|   `-- maven
|       `-- com.patrac
|           `-- Patrac-ear
|               |-- pom.properties
|               `-- pom.xml
|-- Patrac-ejb-1.0-SNAPSHOT.jar
`-- Patrac-web-1.0-SNAPSHOT.war
Run Code Online (Sandbox Code Playgroud)

在应用程序源代码目录中,poms位于以下位置:

.
|
|-- Patrac-ear
|   `-- pom.xml
|-- Patrac-ejb
|  `-- pom.xml
|-- Patrac-web
|   `-- pom.xml
`-- pom.xml
Run Code Online (Sandbox Code Playgroud)

在部署应用程序时,我无法弄清楚如何停止一些恼人的警告消息:

12:32:03,958 WARN  [org.jboss.as.server.deployment] (MSC service thread 1-2) Class Path entry richfaces-components-ui-4.0.0.Final.jar in "/content/Patrac.ear/Patrac-web-1.0-SNAPSHOT.war"  does not point to a valid jar for a Class-Path reference.
12:32:03,970 WARN  [org.jboss.as.server.deployment] (MSC service …
Run Code Online (Sandbox Code Playgroud)

ear maven java-ee-6

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

FacesContext.getCurrentInstance()在FacesServlet(?)处理的请求中返回null

我有一个有两个的Facelet <h:forms>.一个表单中的命令链接执行没有问题.另一种形式的命令链接不起作用:NullPointerException抛出a因为FacesContext.getCurrentInstance()返回null.在我看来,请求通过,FacesServlet所以FacesContext.getCurrentInstance()返回是没有意义的null.

这是XHTML:

<h:form>
    <h:commandLink action="#{localeManager.setLanguage('en')}">English</h:commandLink>
</h:form>
Run Code Online (Sandbox Code Playgroud)

生成的HTML在这里:

<form id="j_idt20" name="j_idt20" method="post" action="/Patrac/faces/academicyear.xhtml" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="j_idt20" value="j_idt20" />
    <script type="text/javascript" src="/Patrac/faces/javax.faces.resource/jsf.js?ln=javax.faces&amp;stage=Development"></script>
    <a href="#" onclick="mojarra.jsfcljs(document.getElementById('j_idt20'),{'j_idt20:j_idt22':'j_idt20:j_idt22'},'');return false">English</a>
    <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="-3103232499387158697:-8681635922139458233" autocomplete="off" />
</form>
Run Code Online (Sandbox Code Playgroud)

这是LocaleManager:

@Named
@SessionScoped
public class LocaleManager implements Serializable
{
...
    public void setLanguage(String language)
    {
        this.locale = new Locale(language);
        FacesContext fc = FacesContext.getCurrentInstance();


        UIViewRoot uivr = fc.getViewRoot(); <===== NullPointerException

        uivr.setLocale(locale);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪: …

java jsf java-ee jsf-2

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

使用Servlet 3.0编程安全性时如何处理会话超时

关于Servlet 3.0编程安全性,当会话超时时无法调用HttpServletRequest#logout().

用户是否仍然登录JAAS?

如果是这样,在会话超时后处理JAAS注销的最佳做法是什么?

容器如何处理用户后续再次登录的请求并在会话超时后创建新会话?

另外,在使用Servlet 3.0编程安全性时,使用以下三种方法处理会话超时的优缺点是什么:

  1. HttpSessionListener#sessionDestroyed()
  2. 制作@ManagedBean @SessionScoped LoginManager工具HttpSessionBindingListener并做一些事情valueUnbound.
  3. 使用@PreDestroy在LoginManager中注释方法.

任何其他建议的方法/最佳实践建议肯定会受到赞赏.

java jaas java-ee servlet-3.0

5
推荐指数
1
解决办法
3500
查看次数

Math.random()和精度损失的好奇心

以下内容无法编译:

int result = Math.random() + 1;

error: possible loss of precision
    int result = Math.random() + 1;
                               ^
    required: int
    found:    double
Run Code Online (Sandbox Code Playgroud)

但下面不会编译:

int result = 0;
result += Math.random() + 1;
Run Code Online (Sandbox Code Playgroud)

为什么?

将可编译代码放入嵌套循环中,可以预期每次迭代时结果都会递增1,因为Math.random()总是返回一个小于1的double,当加到整数时,小数部分会因为精确损失.运行以下代码并查看意外结果:

public class MathRandomCuriosity
{
  public static void main(String[] args)
  {
    int result = 0;
    for (int i = 0; i < 10; i++)
    {
      // System.out.println(result);
      for (int j = 0; j < 20; j++)
      {
        // System.out.println(result);
        for (int k = 0; …
Run Code Online (Sandbox Code Playgroud)

java math

4
推荐指数
1
解决办法
2336
查看次数

org.omnifaces.VetoAnnotatedTypeExtension.processAnnotatedType(@Observes ProcessAnnotatedType)接收所有带注释类型的事件

启动Wildfly时,我收到以下警告:

WELD-000411:Observer方法[BackedAnnotatedMethod] public org.omnifaces.VetoAnnotatedTypeExtension.processAnnotatedType(@Observes ProcessAnnotatedType)接收所有带注释类型的事件.考虑使用@WithAnnotations限制事件或使用带边界的泛型类型.

知道可能导致这种情况的原因吗?这是启动日志:

F:\wildfly-8.1.0.CR2\bin\standalone.bat
[2014-05-30 08:31:55,733] Artifact Enterp:war exploded: Server is not connected. Deploy is not available.
Detected server admin port: 9990
Detected server http port: 8080
Calling "F:\wildfly-8.1.0.CR2\bin\standalone.conf.bat"
"JAVA_OPTS already set in environment; overriding default settings with values: -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:50542,suspend=y,server=n "
Setting JAVA property to "F:\Java\jdk1.8.0_05\bin\java"
===============================================================================

  JBoss Bootstrap Environment

  JBOSS_HOME: "F:\wildfly-8.1.0.CR2"

  JAVA: "F:\Java\jdk1.8.0_05\bin\java"

  JAVA_OPTS: "-Dprogram.name=standalone.bat -Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:50542,suspend=y,server=n "

===============================================================================

Connected to the target VM, address: '127.0.0.1:50542', transport: 'socket'
20:31:56,715 INFO  [org.jboss.modules] (main) JBoss Modules version …
Run Code Online (Sandbox Code Playgroud)

jsf cdi omnifaces wildfly

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

Intellij:如何为javax.annotation.PostConstruct添加java.annotation模块

我将我的项目使用的SDK升级到Java 10.以下import语句导致错误:

import javax.annotation.PostConstruct;

包'javax.annotation'在模块'java.xml.ws.annotation'中声明,但模块'application'不读取它

在此输入图像描述

点击ALT + ENTER让Intellij修复它,我收到了以下选项:

在此输入图像描述

我选择Add Maven Dependency...了以下依赖项添加到pom.xml中.

<dependency>
    <groupId>javax.annotation</groupId>
    <artifactId>javax.annotation-api</artifactId>
    <version>1.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

看着新添加的JAR的MANIFEST.MF,我注意到模块的名称是java.annotation.

在此输入图像描述

所以我添加requires java.annotation到module-info.java.

module application {
    requires java.annotation;
}
Run Code Online (Sandbox Code Playgroud)

当我按CTRL +点击时requires java.annotation:

在此输入图像描述

Intellij正确导航到JAR:

在此输入图像描述

所以看起来我的模块名称正确并且javax.annotation:javax.annotation-api我的模块可以使用.不幸的是,错误import javax.annotation.PostConstruct并没有消失.为了确认我的模块描述符是否正常工作,我添加了其他指令,并且一切正常.我还添加了指令requires java.xml.ws.annotation,

在此输入图像描述

这导致import语句错误消失但当然,这不是一个令人满意的解决方案,因为java.xml.ws.annotation已被弃用并标记为要删除.

在此输入图像描述

有关如何解决此问题的任何想法?我需要能够将模块java.annotation提供给模块,application并且从我在这里这里以及此处此处阅读的方法来实现它是通过向模块路径添加JAR,以及我在这里阅读的新内容必须通过module-info.java中的指令引用添加的模块.

java module intellij-idea java-platform-module-system java-9

2
推荐指数
1
解决办法
3628
查看次数

Intelllij IDEA 13 idea.exe.vmoptions文件库存设置

在安装了Intellij IDEA 13.0之后,我搞砸了并更改了idea.exe.vmoptions,而没有制作文件原始版本的备份副本.我想将文件恢复到原始设置.有没有办法将vmoptions恢复到原始状态?如果没有,库存设置是什么?

intellij-idea

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