簡體   English   中英

JavaFX 模塊信息錯誤未命名模塊從 java.validation 和 jakarta.jakartaee.api 讀取包 javax.validation

[英]JavaFX module-info error the unnamed module reads package javax.validation from both java.validation and jakarta.jakartaee.api

我對 javafx 和模塊信息有疑問。

我想使用 javax.validator:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        validator.validate(dataBaseObjekt)
                .stream()
                .forEach(violation -> System.out.println(violation.getMessage())); 

因此我使用了這個依賴項:

<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.13.Final</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.el</artifactId>
            <version>3.0.0</version>
        </dependency>

當我添加這些依賴項時,IntelliJ 告訴我添加: requires java.validation; 到模塊信息。

當我這樣做時,我得到了錯誤:

java: the unnamed module reads package javax.validation from both java.validation and jakarta.jakartaee.api

當我從模塊信息中刪除此條目時,程序正在運行,但 IntelliJ 向我顯示添加此條目的錯誤。

我能做些什么?

謝謝。

正如 Slaw 所指出的,名稱從 javax 更改為 jakarta。 所以你必須使用所有東西的現代版本,並在你曾經使用 javax 的任何地方使用 jakarta 命名空間。

如果您在代碼的其他部分有很多與模塊化相關的其他問題,那么將您的應用程序設為非模塊化可能會更好。 您可以通過刪除模塊信息來做到這一點。 然后,要么通過命令行開關引用 javafx 模塊,要么使用包含 JavaFX 模塊的 jdk,例如 Bellsoft Liberica “full jdk”或 Azul Zulu “jdk fx”。

示例應用

改編自示例Hibernate Validator 入門文檔

當前文檔也使用過時的名稱,但它們的教程源存儲庫已更新為現代名稱。 希望文檔將在下一個版本中修復...

我也確實更新到了更現代的測試框架(junit 5 而不是 4)。

示例代碼中的一項測試實際上未通過測試斷言 ( manufacturerIsNull() ),因為驗證器框架生成的驗證錯誤消息也發生了一些變化。 語義上是相同的,但消息文本已更改。

src/main/java/module-info.java

module com.example.validator {
    requires jakarta.validation;

    exports com.example.validator;
}

src/main/java/com/example/validator/Car.java

package com.example.validator;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

public class Car {

   @NotNull
   private String manufacturer;

   @NotNull
   @Size(min = 2, max = 14)
   private String licensePlate;

   @Min(2)
   private int seatCount;

   public Car(String manufacturer, String licencePlate, int seatCount) {
      this.manufacturer = manufacturer;
      this.licensePlate = licencePlate;
      this.seatCount = seatCount;
   }

   // getters and setters ...
}

src/test/java/com/example/validator/CarTest.java

package com.example.validator;

import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import java.util.Set;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class CarTest {

private static Validator validator;

   @BeforeAll
   public static void setUp() {
      ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
      validator = factory.getValidator();
   }

   @Test
   public void manufacturerIsNull() {
      Car car = new Car( null, "DD-AB-123", 4 );

      Set<ConstraintViolation<Car>> constraintViolations =
      validator.validate( car );

      assertEquals( 1, constraintViolations.size() );
      assertEquals(
         "may not be null",
         constraintViolations.iterator().next().getMessage()
      );
   }

   @Test
   public void licensePlateTooShort() {
      Car car = new Car( "Morris", "D", 4 );

      Set<ConstraintViolation<Car>> constraintViolations =
      validator.validate( car );

      assertEquals( 1, constraintViolations.size() );
      assertEquals(
         "size must be between 2 and 14",
         constraintViolations.iterator().next().getMessage()
      );
   }

   @Test
   public void seatCountTooLow() {
      Car car = new Car( "Morris", "DD-AB-123", 1 );

      Set<ConstraintViolation<Car>> constraintViolations =
      validator.validate( car );

      assertEquals( 1, constraintViolations.size() );
      assertEquals(
         "must be greater than or equal to 2",
         constraintViolations.iterator().next().getMessage()
      );
   }

   @Test
   public void carIsValid() {
      Car car = new Car( "Morris", "DD-AB-123", 2 );

      Set<ConstraintViolation<Car>> constraintViolations =
      validator.validate( car );

      assertEquals( 0, constraintViolations.size() );
   }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>validator</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>validator</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <junit.version>5.8.2</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>18.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>18.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>7.0.4.Final</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>jakarta.el</artifactId>
            <version>4.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.9.0</version>
                <configuration>
                    <source>18</source>
                    <target>18</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM