当前位置: 首页 > 知识库问答 >
问题:

在本地测试中,由于找不到DayOf周而失败

宋成天
2023-03-14

我创建了一个简单的quarkus(版本0.21.2)应用程序,它使用hibernate orm和panache将实体保存到h2数据库。该实体包括一个元素集合,共DaysOfWeek。我还做了一些测试来确保凝乳有效。这些测试都可以正常工作,但当我在本地运行它们时,我会遇到以下异常:

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);
  }
}

还有本地测试:

import io.quarkus.test.junit.SubstrateTest;

@SubstrateTest
public class NativeOpeningsResourceIT extends OpeningsResourceTest {
    // Execute the same tests but in native mode.
}

我不知道为什么它找不到java。时间DayOfWeek

共有1个答案

宰父君昊
2023-03-14

本机图像工具似乎没有包含java。时间本机映像中的DayOfWeek类。SubstratVM工作在一个封闭的世界中,只能访问在本机映像编译期间发现的类或那些特定注册以进行反射的类。

您可以按照本节注册java。时间DayOfWeek课程:https://quarkus.io/guides/writing-native-applications-tips#registering-供思考。

您可以尝试在实体类上使用注释,但我认为您需要嵌入java。时间DayOfWeek类在反射配置中。json文件,因为我不确定注释是包含实体使用的所有类,还是只包含实体类。

 类似资料:
  • 我是nodejs测试的新手,使用mocha和Chai。现在,我在使用mocha测试API路由处理程序时遇到了问题。我的路由处理程序代码是 Upload函数只是一个multer实用程序,用于存储imagefile。我的测试代码是 运行此代码后显示的输出为

  • 问题内容: 我是Mocha的新手,我正试图用它来测试一个简单的React组件。如果react组件没有任何CSS样式,则测试将通过,但是如果React组件内的标签包含任何className,则会引发语法错误: Testing.react.js testing.jsx 测试将通过: 在输入标签内添加className之后,出现错误: 测试结果: 我已经在网上搜索过,但到目前为止还没有运气。我想念什么吗

  • 当我声明一个本机Java模块时,我发现了一个奇怪的异常——新代码没有通过单元测试。基本上,我从React Native中的NativeModules导入的任何内容都缺少定义:因此单元测试失败,因为类型错误:无法读取未定义的属性“HelloWorld” 复制步骤: 但错误是 实际的Java是 这运行良好(当您运行它时),但单元测试讨厌它。问题似乎是React Native测试缺乏对

  • 我有一个叫做“奇妙”的宝石,里面有一个虚拟的应用程序来测试。运行虚拟应用程序时,一切正常。 但是,当我运行测试时,单元测试工作正常,但是集成测试(Capybara Poltergeist)失败,并显示以下消息: 链轮::FileNot找到:找不到类型为应用程序/javascript的文件jQuery。 签入以下路径: /幻想/spec/dummy/app/assets/images、/fantas

  • 所以我是JUnit的新手,我们必须用它来做家庭作业。我们的教授给了我们一个有一个测试类的项目。当我右键单击>Run as>JUnit Test,我会弹出一个错误,上面写着‘找不到JUnit tests’。我知道这里已经回答了这个问题(没有找到测试运行程序'JUnit4'的测试),但是关闭eclipse、重新启动、清理和构建似乎不起作用。下面是我的运行配置、构建路径和我试图测试的类的截图。

  • 问题内容: 由于某些单元测试失败,Jenkins将良好的构建标记为失败。如果我在不进行单元测试的情况下运行构建,则将获得“构建成功”状态。我如何配置Jenkins来执行以下操作: 构建成功+单元测试失败->发送自定义内容的电子邮件通知,例如构建成功+多少单元测试失败。 构建成功+单元测试成功->发送电子邮件通知,说明构建和单元测试均成功 构建失败->不要运行单元测试->在构建失败时发送电子邮件通知