- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个简单的 quarkus(版本 0.21.2)应用程序,它使用 hibernate orm 和 panache 将实体保存到 h2 数据库。该实体包含 DaysOfWeek
的 ElementCollection
。我还创建了一些测试来确保 CURD 有效。测试一切正常,但当我 native 运行它们时,出现以下异常:
Exception in thread "main" java.lang.RuntimeException: Failed to start quarkus
at io.quarkus.runner.ApplicationImpl1.doStart(ApplicationImpl1.zig:126)
at io.quarkus.runtime.Application.start(Application.java:91)
at io.quarkus.runtime.Application.run(Application.java:204)
at io.quarkus.runner.GeneratedMain.main(GeneratedMain.zig:34)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.persistenceException(FastBootEntityManagerFactoryBuilder.java:113)
at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:67)
at io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.createEntityManagerFactory(FastBootHibernatePersistenceProvider.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at io.quarkus.hibernate.orm.runtime.JPAConfig$LazyPersistenceUnit.get(JPAConfig.java:109)
at io.quarkus.hibernate.orm.runtime.JPAConfig.startAll(JPAConfig.java:57)
at io.quarkus.hibernate.orm.runtime.HibernateOrmRecorder.startAllPersistenceUnits(HibernateOrmRecorder.java:77)
at io.quarkus.deployment.steps.HibernateOrmProcessor$startPersistenceUnits19.deploy_0(HibernateOrmProcessor$startPersistenceUnits19.zig:51)
at io.quarkus.deployment.steps.HibernateOrmProcessor$startPersistenceUnits19.deploy(HibernateOrmProcessor$startPersistenceUnits19.zig:70)
at io.quarkus.runner.ApplicationImpl1.doStart(ApplicationImpl1.zig:90)
... 3 more
Caused by: org.hibernate.MappingException: Could not create DynamicParameterizedType for type: org.hibernate.type.EnumType
at org.hibernate.mapping.SimpleValue.createParameterImpl(SimpleValue.java:768)
at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:470)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:455)
at org.hibernate.mapping.Collection.validate(Collection.java:315)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:347)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:461)
at io.quarkus.hibernate.orm.runtime.boot.FastBootEntityManagerFactoryBuilder.build(FastBootEntityManagerFactoryBuilder.java:65)
... 12 more
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [java.time.DayOfWeek]
at io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService.classForName(FlatClassLoaderService.java:39)
at org.hibernate.mapping.SimpleValue.createParameterImpl(SimpleValue.java:755)
... 18 more
Caused by: java.lang.ClassNotFoundException: java.time.DayOfWeek
at com.oracle.svm.core.hub.ClassForNameSupport.forName(ClassForNameSupport.java:60)
at java.lang.Class.forName(DynamicHub.java:1174)
at io.quarkus.hibernate.orm.runtime.service.FlatClassLoaderService.classForName(FlatClassLoaderService.java:37)
... 19 more
我的实体如下所示:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import java.time.DayOfWeek;
import java.time.LocalTime;
import java.util.*;
import static org.hibernate.annotations.CascadeType.ALL;
@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class OpeningTimes extends PanacheEntityBase {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private UUID id;
@NotNull
private String name;
private String description;
private LocalTime timeFrom;
private LocalTime timeTo;
@ElementCollection
@Cascade(value = {ALL})
private Collection<DayOfWeek> daysOfWeek;
/**
* DO NOT USE! ONLY FOR JPA!
*/
OpeningTimes() {
super();
name = "";
}
@JsonCreator
public OpeningTimes(
@JsonProperty("name") String name,
@JsonProperty("timeFrom") LocalTime timeFrom,
@JsonProperty("timeTo") LocalTime timeTo,
@JsonProperty("daysOfWeek") Collection<DayOfWeek> daysOfWeek) {
this.name = name;
this.timeFrom = timeFrom;
this.timeTo = timeTo;
this.daysOfWeek = new HashSet<>(daysOfWeek);
}
public OpeningTimes(String name, LocalTime from, LocalTime to, DayOfWeek... daysOfWeek) {
this(name, from, to, new ArrayList<>(Arrays.asList(daysOfWeek)));
}
public LocalTime getTimeFrom() {
return timeFrom;
}
public void setTimeFrom(LocalTime timeFrom) {
this.timeFrom = timeFrom;
}
public LocalTime getTimeTo() {
return timeTo;
}
public void setTimeTo(LocalTime timeTo) {
this.timeTo = timeTo;
}
public Collection<DayOfWeek> getDaysOfWeek() {
return daysOfWeek;
}
public void setDaysOfWeek(Set<DayOfWeek> daysOfWeek) {
this.daysOfWeek = daysOfWeek;
}
public UUID getId() {
return id;
}
public void setId(UUID id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof OpeningTimes)) return false;
OpeningTimes that = (OpeningTimes) o;
return Objects.equals(getId(), that.getId())
&& Objects.equals(getName(), that.getName())
&& Objects.equals(getDescription(), that.getDescription())
&& Objects.equals(getTimeFrom(), that.getTimeFrom())
&& Objects.equals(getTimeTo(), that.getTimeTo())
&& Objects.equals(getDaysOfWeek(), that.getDaysOfWeek());
}
@Override
public int hashCode() {
return Objects.hash(
getId(), getName(), getDescription(), getTimeFrom(), getTimeTo(), getDaysOfWeek());
}
@Override
public String toString() {
return "OpeningTimes{"
+ "id="
+ id
+ ", name='"
+ name
+ '\''
+ ", description='"
+ description
+ '\''
+ ", timeFrom="
+ timeFrom
+ ", timeTo="
+ timeTo
+ ", daysOfWeek="
+ daysOfWeek
+ '}';
}
public void merge(OpeningTimes openingTimes) {
this.name = openingTimes.name;
this.description = openingTimes.description;
this.timeFrom = openingTimes.timeFrom;
this.timeTo = openingTimes.timeTo;
this.daysOfWeek = openingTimes.daysOfWeek;
}
}
这是我的测试:
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.h2.H2DatabaseTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.http.ContentType;
import io.restassured.mapper.ObjectMapperType;
import io.restassured.mapper.TypeRef;
import io.restassured.response.Response;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.transaction.Transactional;
import java.time.DayOfWeek;
import java.time.LocalTime;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
@QuarkusTest
@QuarkusTestResource(H2DatabaseTestResource.class)
class OpeningsResourceTest {
private static final Logger LOG = LoggerFactory.getLogger(OpeningsResourceTest.class);
@Test
void testSaveOpening() {
OpeningTimes opening =
new OpeningTimes(
"Test opening", LocalTime.MIN, LocalTime.NOON, DayOfWeek.MONDAY, DayOfWeek.THURSDAY);
Response response =
given()
.when()
.contentType(ContentType.JSON)
.body(opening, ObjectMapperType.JACKSON_2)
.post("/service/events/openings");
LOG.debug(response.andReturn().body().prettyPrint());
OpeningTimes responseObject = response.then().statusCode(200).extract().as(OpeningTimes.class);
// Set the id because its generated on saving
opening.setId(responseObject.getId());
assertThat(responseObject, equalTo(opening));
}
@Test
void testGetOpening() {
OpeningTimes testdata = saveTestdata().get(0);
Response response = given().when().get("/service/events/openings/{id}/", testdata.getId());
OpeningTimes responseObject = response.then().statusCode(200).extract().as(OpeningTimes.class);
assertThat(responseObject, equalTo(testdata));
}
@Test
void testDeleteOpening() {
OpeningTimes testdata = saveTestdata().get(0);
// Delete
given()
.when()
.delete("/service/events/openings/{id}/", testdata.getId())
.then()
.statusCode(204);
// Check if it is deleted
given().when().get("/service/events/openings/{id}/", testdata.getId()).then().statusCode(204);
}
@Test
void testChangeOpening() {
OpeningTimes testdata = saveTestdata().get(0);
testdata.setDescription("Example description");
Response response =
given()
.when()
.contentType(ContentType.JSON)
.body(testdata, ObjectMapperType.JACKSON_2)
.put("/service/events/openings/");
LOG.debug(response.andReturn().body().prettyPrint());
response.then().statusCode(200).extract().as(OpeningTimes.class);
OpeningTimes changedOpening =
given()
.when()
.get("/service/events/openings/{id}", testdata.getId())
.then()
.statusCode(200)
.extract()
.as(OpeningTimes.class);
assertThat(changedOpening, is(testdata));
}
private List<OpeningTimes> saveTestdata() {
OpeningTimes opening1 =
new OpeningTimes(
"Test opening", LocalTime.MIN, LocalTime.NOON, DayOfWeek.MONDAY, DayOfWeek.THURSDAY);
OpeningTimes opening2 =
new OpeningTimes("Test opening 2", LocalTime.MIN, LocalTime.NOON, DayOfWeek.FRIDAY);
opening1 =
given()
.contentType(ContentType.JSON)
.body(opening1, ObjectMapperType.JACKSON_2)
.post("/service/events/openings")
.then()
.extract()
.as(OpeningTimes.class);
opening2 =
given()
.contentType(ContentType.JSON)
.body(opening2, ObjectMapperType.JACKSON_2)
.post("/service/events/openings")
.then()
.extract()
.as(OpeningTimes.class);
return Arrays.asList(opening1, opening2);
}
@Test
void testGetAll() {
List<OpeningTimes> testdata = saveTestdata();
Collection<OpeningTimes> openings =
given()
.when()
.get("/service/events/openings")
.then()
.statusCode(200)
.extract()
.as(new TypeRef<Collection<OpeningTimes>>() {});
assertThat(openings, is(testdata));
}
@AfterEach
@Transactional
void cleanUpDatabase() {
// Delete all won't work because of the element collection
OpeningTimes.findAll().stream().forEach(PanacheEntityBase::delete);
}
}
以及 native 测试:
import io.quarkus.test.junit.SubstrateTest;
@SubstrateTest
public class NativeOpeningsResourceIT extends OpeningsResourceTest {
// Execute the same tests but in native mode.
}
我不知道为什么它找不到java.time.DayOfWeek
。
最佳答案
原生镜像工具似乎没有在原生镜像中包含 java.time.DayOfWeek
类。 SubstratVM 在封闭世界中工作,只能访问在 native 镜像编译期间发现的类或专门注册用于反射的类。
您可以按照本节操作来注册 java.time.DayOfWeek
类的反射:https://quarkus.io/guides/writing-native-applications-tips#registering-for-reflection .
您可以尝试在实体类上使用注释,但我认为您需要在 reflection-config.json
文件中包含 java.time.DayOfWeek
类因为我不确定注释是否将包含您的实体使用的所有类或仅包含您的实体类。
关于java - 由于未找到 DayOfWeek,Quarkus 测试在 native 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57946841/
我获得了一些源代码示例,我想测试一些功能。不幸的是,我在执行程序时遇到问题: 11:41:31 [linqus@ottsrvafq1 example]$ javac -g test/test.jav
我想测试ggplot生成的两个图是否相同。一种选择是在绘图对象上使用all.equal,但我宁愿进行更艰巨的测试以确保它们相同,这似乎是identical()为我提供的东西。 但是,当我测试使用相同d
我确实使用 JUnit5 执行我的 Maven 测试,其中所有测试类都有 @ExtendWith({ProcessExtension.class}) 注释。如果是这种情况,此扩展必须根据特殊逻辑使测试
在开始使用 Node.js 开发有用的东西之前,您的流程是什么?您是否在 VowJS、Expresso 上创建测试?你使用 Selenium 测试吗?什么时候? 我有兴趣获得一个很好的工作流程来开发我
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 基于示例here ,我尝试为我的
我正在考虑测试一些 Vue.js 组件,作为 Laravel 应用程序的一部分。所以,我有一个在 Blade 模板中使用并生成 GET 的组件。在 mounted 期间请求生命周期钩子(Hook)。假
考虑以下程序: #include struct Test { int a; }; int main() { Test t=Test(); std::cout<
我目前的立场是:如果我使用 web 测试(在我的例子中可能是通过 VS.NET'08 测试工具和 WatiN)以及代码覆盖率和广泛的数据来彻底测试我的 ASP.NET 应用程序,我应该不需要编写单独的
我正在使用 C#、.NET 4.7 我有 3 个字符串,即。 [test.1, test.10, test.2] 我需要对它们进行排序以获得: test.1 test.2 test.10 我可能会得到
我有一个 ID 为“rv_list”的 RecyclerView。单击任何 RecyclerView 项目时,每个项目内都有一个可见的 id 为“star”的 View 。 我想用 expresso
我正在使用 Jest 和模拟器测试 Firebase 函数,尽管这些测试可能来自竞争条件。所谓 flakey,我的意思是有时它们会通过,有时不会,即使在同一台机器上也是如此。 测试和函数是用 Type
我在测试我与 typeahead.js ( https://github.com/angular-ui/bootstrap/blob/master/src/typeahead/typeahead.js
我正在尝试使用 Teamcity 自动运行测试,但似乎当代理编译项目时,它没有正确完成,因为当我运行运行测试之类的命令时,我收到以下错误: fatal error: 'Pushwoosh/PushNo
这是我第一次玩 cucumber ,还创建了一个测试和 API 的套件。我的问题是在测试 API 时是否需要运行它? 例如我脑子里有这个, 启动 express 服务器作为后台任务 然后当它启动时(我
我有我的主要应用程序项目,然后是我的测试的第二个项目。将所有类型的测试存储在该测试项目中是一种好的做法,还是应该将一些测试驻留在主应用程序项目中? 我应该在我的主项目中保留 POJO JUnit(测试
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我正在尝试测试一些涉及 OkHttp3 的下载代码,但不幸失败了。目标:测试 下载图像文件并验证其是否有效。平台:安卓。此代码可在生产环境中运行,但测试代码没有任何意义。 产品代码 class Fil
当我想为 iOS 运行 UI 测试时,我收到以下消息: SetUp : System.Exception : Unable to determine simulator version for X 堆
我正在使用 Firebase Remote Config 在 iOS 上设置 A/B 测试。 一切都已设置完毕,我正在 iOS 应用程序中读取服务器端默认值。 但是在多个模拟器上尝试,它们都读取了默认
[已编辑]:我已经用 promise 方式更改了我的代码。 我正在写 React with this starter 由 facebook 创建,我是测试方面的新手。 现在我有一个关于图像的组件,它有
我是一名优秀的程序员,十分优秀!