作为 Java SE 12 的一部分,引入了switch表达式,并且从 Java SE 14 开始,它们已经标准化。它们与switch陈述有何不同?
我有一个记录,想向它添加默认构造函数。
public record Record(int recordId) {
public Record {
}
}
Run Code Online (Sandbox Code Playgroud)
但它用int参数创建了构造函数。
public final class Record extends java.lang.Record {
private final int recordId;
public Record(int);
//other method
}
Run Code Online (Sandbox Code Playgroud)
我们如何向记录添加默认构造函数?
我正在运行 KeyCloak 服务器来验证想要访问 Spring Boot/Spring Web REST API 的用户。但是,尝试进行身份验证时发生错误。
以下工作:
http://localhost:8080/path/to/restapi白标错误页面 此应用程序没有明确的 /error 映射,因此您将其视为后备。
这是打印到 Spring Boot 控制台的错误:
Caused by: java.lang.ClassNotFoundException: java.security.acl.Group
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
... 33 common frames omitted
Run Code Online (Sandbox Code Playgroud)
KeyCloak 服务器显示该会话对于该应用程序的用户来说是活动的。但是,由于上述缺少的类,认证过程永远不会完成。
有一条消息
项目已由更新版本的 Java Runtime(类文件版本 57.0)编译,此版本的 Java Runtime 仅识别最高 52.0 的类文件版本
我在谷歌上搜索了“JDK 14 所需的 JRE”,但没有找到下载。在我的 Windows 10 上的 Java 控制面板中,它说我拥有最新版本的 Java 平台。我无法降级项目中的 JDK,因为我使用的是完全在 Java 14 上编译的库。如何(以及在哪里)升级 JRE 以匹配 Java 14 并支持版本 57?
鉴于以下代码:
public static void main(String[] args) {
record Foo(int[] ints){}
var ints = new int[]{1, 2};
var foo = new Foo(ints);
System.out.println(foo); // Foo[ints=[I@6433a2]
System.out.println(new Foo(new int[]{1,2}).equals(new Foo(new int[]{1,2}))); // false
System.out.println(new Foo(ints).equals(new Foo(ints))); //true
System.out.println(foo.equals(foo)); // true
}
Run Code Online (Sandbox Code Playgroud)
显然,似乎使用了数组的toString,equals方法(而不是静态方法、Arrays::equals、Arrays::deepEquals 或Array::toString)。
所以我猜 Java 14 Records ( JEP 359 ) 不能很好地处理数组,必须使用 IDE 生成相应的方法(至少在 IntelliJ 中,默认情况下会生成“有用”的方法,即它们使用静态方法在Arrays)。
或者还有其他解决方案吗?
我想看看我是否可以用 Java 14 中的新 Record 类替换我现有的 Pojo。但无法这样做。得到以下错误:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例
com.a.a.Post(无创建者,如默认构造,存在):无法从对象值反序列化(无基于委托或属性的创建者)
我知道错误是说记录没有构造函数,但是从我所看到的记录类在后台处理它,并且相关的 getter 也在后台设置(不完全是 getter,而是 id() title() 等等没有 get 前缀)。是不是因为 Spring 还没有采用最新的 Java 14 记录?请指教。谢谢。
我在 Spring Boot 版本 2.2.6 中执行此操作并使用 Java 14。
以下使用通常的 POJO 工作。
邮政类
public class PostClass {
private int userId;
private int id;
private String title;
private String body;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getId() {
return id;
}
public void setId(int id) { …Run Code Online (Sandbox Code Playgroud) Java 14 有许多新特性。其中之一是在 NullPointerException 中显示详细消息。我安装了 Java 14 并尝试在类下编译和运行,但没有收到任何详细消息。我错过了什么吗?请帮忙。
~/code/demo/temp$ java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment AdoptOpenJDK (build 14+36)
Eclipse OpenJ9 VM AdoptOpenJDK (build openj9-0.19.0, JRE 14 Mac OS X amd64-64-Bit Compressed References 20200313_47 (JIT enabled, AOT enabled)
OpenJ9 - 0133ba037
OMR - 1c04e0ef9
JCL - a73be60649 based on jdk-14+36)
~/code/demo/temp$ cat Hello.java
public class Hello {
public static void main(String args[]) {
String a = null;
System.out.println(a.length());
}
}
~/code/demo/temp$ javac Hello.java
~/code/demo/temp$ java -XX:+ShowCodeDetailsInExceptionMessages Hello
Exception …Run Code Online (Sandbox Code Playgroud) 刚刚从Java 11迁移到Java 14
以下代码现在在 linux 机器上失败:
String linux_exe = System.getProperty("user.dir") + '/' + "fpcalc_arm32";
List<String> params = new ArrayList();
params.add(linux_exe);
params.add("-plain");
params.add("-length");
params.add(submittedSongLength);
params.add(file.getPath());
Process p = Runtime.getRuntime().exec(params.toArray(new String[1]));
Run Code Online (Sandbox Code Playgroud)
带堆栈跟踪
Cannot run program "/mnt/system/config/Apps/SongKong/songkong/fpcalc_arm32": error=0, Failed to exec spawn helper: pid: 13998, exit value: 127
java.io.IOException: Cannot run program "/mnt/system/config/Apps/SongKong/songkong/fpcalc_arm32": error=0, Failed to exec spawn helper: pid: 13998, exit value: 127
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
at java.base/java.lang.Runtime.exec(Runtime.java:590)
at java.base/java.lang.Runtime.exec(Runtime.java:449)
at com.jthink.songkong.analyse.acoustid.AcoustId.generateFingerprint(AcoustId.java:217)
at com.jthink.songkong.analyse.acoustid.AcoustId.createAcoustIdFingerprint(AcoustId.java:106)
Run Code Online (Sandbox Code Playgroud)
Java 14 发生了什么变化会导致这种情况?
我使用 …
有没有办法用 Java 记录做空对象?对于课程,我会这样做:
public class Id {
public static final Id NULL_ID = new Id();
private String id;
public Id(String id) {
this.id = Objects.requireNonNull(id);
}
private Id() {}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为每个构造函数都需要经过规范的 ( Id(String id)构造函数,而我不能只是调用super()来绕过不变量。
public record Id(String id) {
public static final Id NULL_ID = null; // how?
public Id {
Objects.requireNonNull(id);
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
现在我解决了这个问题
public Id {
if (NULL_OBJECT != null)
Objects.requireNonNull(id);
}
Run Code Online (Sandbox Code Playgroud)
但这感觉不对,并且容易出现并发问题。
我还没有发现很多关于记录背后的设计思想的讨论,这可能已经讨论过了。如果像这样保持简单,那是可以理解的,但感觉很尴尬,我已经在小样本中多次遇到这个问题。
我有带有有效注释的旧 POJO:
public class SomeData {
@NotNull(message = "Data not be null")
private String data;
public FormData(String data) {
this.data = data;
}
public String getData() {
return data;
}
public String setData(String data) {
this.data = data
}
}
Run Code Online (Sandbox Code Playgroud)
但知道我有records
public record SomeData(String data) {}
Run Code Online (Sandbox Code Playgroud)
如何在记录中添加注释?
java-14 ×10
java ×9
java-record ×4
java-11 ×2
spring-boot ×2
arrays ×1
keycloak ×1
openj9 ×1
record ×1
spring ×1