小编Mar*_*son的帖子

Java 8是否缺少OptionalBoolean?

作为一种原始的版本Optional*,爪哇1.8提供OptionalInt,OptionalLongOptionalDouble.

但我找不到同等的OptionalBoolean班级.

是否有任何技术原因反对OptionalBoolean

* 一个Optional可以或可以不具有一个值的情况下,使用作为替代null.

java monads boolean optional java-8

32
推荐指数
2
解决办法
7902
查看次数

Internet Explorer 11不会在CORS请求中添加Origin标头?

我的问题取决于我认为的几个假设.

假设nr 1:原始标题

Origin头是由浏览器需要在CORS(跨源资源共享)请求被投入.

维基百科:

要启动跨源请求,浏览器会使用Origin HTTP标头发送请求.

HTML5岩石:

首先要注意的是,有效的CORS请求始终包含Origin头.此Origin标头由浏览器添加,不能由用户控制.

W3:

如果请求URL源与原始URL源不同,请将源origin设置为全局唯一标识符[..].

假设2:Internet Explorer 10+支持CORS

请参阅caniuse.com并使用谷歌获取数百种不同类型的来源声称支持.

假设nr 3:不同的端口是不同的起源

使用不同端口号的资源被认为具有不同的来源:

维基百科

当且仅当所有这些值完全相同时,才认为两个资源具有相同的来源.[..]失败 - 相同的协议和主机但不同的端口.

Mozilla开发者网络

如果协议,端口(如果指定了一个端口)和主机对两个页面都相同,则两个页面具有相同的原点.

问题:

Origin在向同一域"localhost"发出CORS请求但使用不同端口(从8411到8080)时,Internet Explorer 11不会发送标头.Opera,FireFox和Chrome会发送Origin标头.然而每个人都在说Internet Explorer 10+支持CORS吗?

internet-explorer xmlhttprequest cross-domain cors

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

使用CDI在Java EE应用程序中获取对EntityManager的引用

我正在使用Java EE 7.我想知道将JPA EntityManager注入应用程序范围的 CDI bean 的正确方法是什么.您不能只使用@PersistanceContext注释注入它,因为EntityManager实例不是线程安全的.假设我们希望EntityManager在每个HTTP请求处理的开始时创建我们,并在处理HTTP请求后关闭它们.我想到了两个选择:

1.创建一个请求范围的CDI bean,它具有对a的引用EntityManager,然后将bean注入到应用程序范围的CDI bean中.

import javax.enterprise.context.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@RequestScoped
public class RequestScopedBean {

    @PersistenceContext
    private EntityManager entityManager;

    public EntityManager getEntityManager() {
        return entityManager;
    }
}
Run Code Online (Sandbox Code Playgroud)
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;

@ApplicationScoped
public class ApplicationScopedBean {

    @Inject
    private RequestScopedBean requestScopedBean;

    public void persistEntity(Object entity) {
        requestScopedBean.getEntityManager().persist(entity);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,EntityManager将在创建时RequestScopedBean创建,并在RequestScopedBean销毁时关闭.现在我可以将注入移动到一些抽象类中以将其从中删除ApplicationScopedBean.

2.创建一个生成实例的生产者,EntityManager然后将EntityManager实例注入到应用程序范围的CDI bean中.

import …
Run Code Online (Sandbox Code Playgroud)

java jpa entitymanager cdi java-ee-7

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

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

Java EE中JspWriter和PrintWriter的区别?

为了你的"重复"的狂热分子,对这样的权利类似的问题在这里.不同之处在于我画了一个生动的例子,我无法理解其输出.

对于文档的JspWriterPrintWriter的说,有两点不同:1的JspWriter可以抛出异常,应该的PrintWriter不这样做.2. JspWriter在场景后面使用PrintWriter,但由于默认情况下JSP页面是缓冲的,因此直到the buffer is flushedJSP页面上下文中的任何含义都不会创建PrintWriter .我不确定我是否理解了最后一部分.考虑这个JSP页面:

<%@page import="java.io.PrintWriter"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JspWriter versus PrintWriter</title>
    </head>
    <body>
        <p>I should be row one.</p>
        <%
            out.println("<p>JspWriter said: I should be the second row.</p>");

            PrintWriter pw = response.getWriter();
            pw.println("<p>PrintWriter said: I should be the third row.</p>");
        %>
        <p>I should be the fourth row.</p>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

PrintWriter said: I should be the third row. …
Run Code Online (Sandbox Code Playgroud)

buffer jsp java-ee printwriter output

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

是否可以创建一个ThreadLocal作为Java虚拟线程的承载线程?

JEP-425:虚拟线程指出“应该为每个应用程序任务创建一个新的虚拟线程”,并两次提到在 JVM 中运行“数百万”虚拟线程的可能性。

相同的 JEP 意味着每个虚拟线程都可以访问其自己的线程本地值:

虚拟线程就像平台线程一样支持线程局部变量,因此它们可以运行使用线程局部变量的现有代码。

线程局部变量多次用于缓存非线程安全且创建成本昂贵的对象。JEP 警告:

但是,由于虚拟线程可能非常多,因此请在仔细考虑后使用线程局部变量。

确实很多!特别是考虑到虚拟线程不被池化(或者至少不应该被池化)。作为短期任务的代表,在虚拟线程中使用线程局部变量来缓存昂贵的对象似乎毫无意义。除非!我们可以从虚拟线程创建并访问绑定到其载体线程的线程局部变量

为了澄清起见,我想从这样的事情开始(当仅使用上限为池大小的本机线程时,这是完全可以接受的,但是当连续运行数百万个虚拟线程时,这显然不再是一个非常有效的缓存机制重新创建:

static final ThreadLocal<DateFormat> CACHED = ThreadLocal.withInitial(DateFormat::getInstance);
Run Code Online (Sandbox Code Playgroud)

为此(可惜这个类不是公共 API 的一部分):

static final ThreadLocal<DateFormat> CACHED = new jdk.internal.misc.CarrierThreadLocal();
// CACHED.set(...)
Run Code Online (Sandbox Code Playgroud)

在我们到达那里之前。人们必须问,这是一种安全的做法吗?

好吧,据我正确理解虚拟线程,它们只是在平台线程(又名“载体线程”)上执行的逻辑阶段,能够卸载而不是被阻塞等待。所以我假设 - 如果我错了,请纠正我 - 1)虚拟线程永远不会被同一载体线程上的另一个虚拟线程交错或重新安排在另一个载体线程上,除非代码否则会阻塞,因此,如果 2 )我们对缓存对象调用的操作永远不会阻塞,那么任务/虚拟线程将简单地在同一载体上从头到尾运行,所以是的,将对象缓存在平台线程本地上是安全的。

冒着回答我自己的问题的风险,JEP-425 表明这是不可能的:

载体的线程局部变量对于虚拟线程不可用,反之亦然。

我找不到公共 API 来获取载体线程或在平台线程上显式分配线程局部变量(从虚拟线程),但这并不是说我的研究是确定的。也许有办法吗?

然后我读了JEP-429: Scoped Values,乍一看似乎是 Java 之神试图完全摆脱它ThreadLocal,或者至少为虚拟线程提供替代方案。事实上,JEP 使用了诸如“迁移到作用域值”之类的措辞,并表示它们“优于线程局部变量,尤其是在使用大量虚拟线程时”。

对于 JEP 中讨论的所有用例,我只能同意。但在本文档的底部,我们还发现了这一点:

有一些场景有利于线程局部变量。一个示例是缓存创建和使用成本高昂的对象,例如 java.text.DateFormat 的实例。众所周知,DateFormat 对象是可变的,因此如果没有同步,就无法在线程之间共享它。通过在线程生命周期内持续存在的线程局部变量为每个线程提供自己的 DateFormat 对象通常是一种实用的方法。

根据前面讨论的内容,使用线程本地可能是“实用的”,但不是很理想。事实上,JEP-429 本身实际上是从一个非常有说服力的评论开始的:“如果一百万个虚拟线程中的每一个都有可变的线程局部变量,那么内存占用可能会很大”。

总结一下:

您是否找到了从虚拟线程在载体线程上分配线程局部变量的方法?

如果不是,那么可以肯定地说,对于使用虚拟线程的应用程序,在线程本地缓存对象的做法已经死亡,并且必须实现/使用不同的方法,例如并发缓存/映射/池/其他方法?

java caching thread-local virtual-threads

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

什么是Java EE Endorsed API?

看到这里.

Maven存储库中有三种不同的Java EE相关API:s.

  1. 规范API(Maven工件:javaee-api)
  2. Web规范API(javaee-web)
  3. 认可的API(javaee-endorsed-api)

我知道规范API(Java EE API的完整套件:s)和Web API(前者的一个子集,由一些应用程序服务器实现).

但是什么是"认可的API",我需要关心吗?

注意:我确实找到了这个链接,但它没有告诉我什么.

api endorsed java-ee maven

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

如何取消屏蔽JavaFX PasswordField或正确屏蔽TextField?

在我的用户界面中,我有一个像这样的密码字段(urm底部的那个!):

使用JavaFX PasswordField登录对话框

我希望用户能够检查您在图片中看到的复选框,并显示所有"秘密"密码字符.与我们从许多现代密码请求UI中获得的选项没什么不同:s漂浮在周围.但是,我在JavaFX API中找不到任何可以让我这样做的东西?

如果我的担心成立,那么我想用一个TextField显示最后一个键只按下半秒或直到按下下一个键,然后他将屏蔽所有以前的用户输入.这将产生一种很酷的动画效果,人们可以在现代UI中看到它们:s.但是,有没有办法让我掌握OS依赖(我认为它是操作系统依赖??)我应该使用的密码回音字符?

如果无法获得与操作系统相关的字符,那么我很乐意使用您在图片上看到的字符(Windows 8计算机上的JavaFX).这个陌生人的UTF-8代码点是什么?

utf-8 password-protection textfield javafx-2

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

PHP的DateTime :: Diff搞错了?

DateTime :: Diff应计算适当的间隔并考虑夏令时(DST)和闰年.虽然显然不是这样.恐怖代码:

$d1 = new DateTime("2011-10-30 01:05:00", new DateTimeZone("Europe/Stockholm"));
$d2 = new DateTime("2011-10-30 03:05:00", new DateTimeZone("Europe/Stockholm"));

echo $d1->getOffset() / (60 * 60);
Run Code Online (Sandbox Code Playgroud)

打印'2'!请记住前一天的UTC时间= 1h - 2h = 23:05:00.

echo $d2->getOffset() / (60 * 60);
Run Code Online (Sandbox Code Playgroud)

打印'1'.DST发生了.UTC时间= 3h - 1h = 02:05:00

$di = $d1->diff($d2);
echo "Hours of DateInterval: " . $di->h;
Run Code Online (Sandbox Code Playgroud)

打印'2'!错误?

$hoursofdiff = ($d2->getTimeStamp() - $d1->getTimeStamp()) / 60 / 60;
echo "Calculated difference in hours: $hoursofdiff";
Run Code Online (Sandbox Code Playgroud)

打印'3'!正确?

当时钟在给定日期时间03:00:00时,所有瑞典人将他们的时钟倒退一小时至02:00:00.这意味着在01:05到03:05之间传递的总量是三个小时,非常类似于使用UNIX TimeStamp时的手动计算回显.就像我们用手指计算我们是否使用模拟时钟一样.当我们使用PHP自己的偏移逻辑(!)计算两个UTC时间戳之间的差异时更是如此.

它是PHP还是我的大脑停止正常工作?来自你们任何人的谴责所有存在于这个网站上的众神会让我如此开心!

我在Apache服务器上使用PHP 5.4(VC9).不幸的是我使用Windows 7 x64作为操作系统.我已经针对PHP日期/时间类中的所有错误声明测试了我的设置(有一些与Windows相关),并且可以确认我的系统没有.除了上述代码,我没有发现任何其他错误.我几乎验证了所有代码并输出了"PHP Architect的日期和时间编程指南"这本书.因此,我必须得出结论,它必须是我的大脑女巫违约,但我想我先在这里拍摄.

php diff datetime dts

11
推荐指数
2
解决办法
3911
查看次数

为什么Java multi-catch不能处理与子类相关的类型?

这是一段不能编译的代码:

void multiCatch()
{
    try {
        throwIOFile();
    }
    // FileNotFoundException extends IOException, hence this
    // does not compile ("alternatives" related by sub classing):
    catch (IOException | FileNotFoundException e) { }
}

void throwIOFile() throws IOException, FileNotFoundException
{}
Run Code Online (Sandbox Code Playgroud)

一切都像魅力一样,没有与子类别相关的异常类型.如果您IOException在我的代码片段中交换说.. SQLException,它可以工作.该规范内容如下:

如果类型的并集包含两个备选Di和Dj(i≠j),则其是编译时错误,其中Di是Dj的子类型.

我无法理解这背后的理由.当然,我的例子中的多次捕获是完全多余的,因为我也可以只捕获一个IOException.但是,使我的代码片段合法会有什么危害?当然,违法行为必然会造成伤害吗?

java types java-7 multi-catch

9
推荐指数
2
解决办法
4284
查看次数