Java EE/Jakarta EE 三大规范详解:CDI、JPA 与 Bean Validation

Java EE/Jakarta EE 三大规范详解:CDI、JPA 与 Bean Validation 一、CDI:Contexts and Dependency Injection(上下文与依赖注入) 1. CDI 简介 CDI 是 Java EE 提供的依赖注入和生命周期管理标准,提供: 类型安全的依赖注入机制 生 …

Java EE/Jakarta EE 三大规范详解:CDI、JPA 与 Bean Validation


一、CDI:Contexts and Dependency Injection(上下文与依赖注入)

1. CDI 简介

CDI 是 Java EE 提供的依赖注入和生命周期管理标准,提供:

  • 类型安全的依赖注入机制
  • 生命周期与作用域控制
  • 拦截器、事件系统、装饰器等扩展功能

2. 常用注解说明

注解功能说明
@Inject注入依赖对象
@Named定义 Bean 名称,供 EL 表达式使用
@ApplicationScoped应用作用域,整个应用生命周期
@RequestScoped每个 HTTP 请求周期一个实例
@SessionScoped每个 HTTP 会话一个实例
@Dependent(默认)与注入点生命周期一致
@Produces生产一个注入对象
@Qualifier自定义限定符,用于区分同类 Bean

3. CDI 示例

Bean 类定义

@ApplicationScoped
public class GreetingService {
    public String greet(String name) {
        return "Hello, " + name;
    }
}

使用 @Inject 注入 Bean

@RequestScoped
public class UserController {

    @Inject
    private GreetingService greetingService;

    public void handleRequest() {
        System.out.println(greetingService.greet("Alice"));
    }
}

使用 @Produces

public class Resources {
    @Produces
    @RequestScoped
    public EntityManager produceEntityManager() {
        return Persistence.createEntityManagerFactory("myPU").createEntityManager();
    }
}

二、JPA:Java Persistence API(持久化规范)

1. JPA 简介

JPA 是 Java EE 标准 ORM 框架,提供实体映射、对象关系管理、查询语言(JPQL)等。

2. 常用注解说明

注解用途说明
@Entity标识实体类
@Table指定数据库表名
@Id主键
@GeneratedValue主键生成策略
@Column字段映射属性
@ManyToOne / @OneToMany关联关系
@Transient不持久化的字段

3. 实体类示例

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    private int age;

    // Getters & Setters
}

4. 使用 EntityManager

@ApplicationScoped
public class UserRepository {

    @Inject
    private EntityManager em;

    public User findById(Long id) {
        return em.find(User.class, id);
    }

    public void save(User user) {
        em.getTransaction().begin();
        em.persist(user);
        em.getTransaction().commit();
    }
}

三、Bean Validation(JSR 380 / Jakarta Bean Validation)

1. Bean Validation 简介

用于对 Java Bean 属性进行声明式验证,常与 JPA、REST API 结合使用。

2. 常用注解说明

注解验证内容
@NotNull不为 null
@Size字符串/集合长度限制
@Min/@Max数值最小/最大值
@Email合法的 Email 格式
@Pattern匹配正则表达式
@Valid嵌套验证 Bean

3. 实体类使用 Bean Validation

@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    @Size(min = 2, max = 20)
    private String name;

    @Min(18)
    private int age;

    @Email
    private String email;
}

4. 在资源类中触发验证

@Path("/users")
@RequestScoped
public class UserResource {

    @Inject
    private UserRepository userRepo;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createUser(@Valid User user) {
        userRepo.save(user);
        return Response.status(201).build();
    }
}

5. 全局异常处理(ConstraintViolationException

@Provider
public class ConstraintViolationMapper implements ExceptionMapper<ConstraintViolationException> {

    @Override
    public Response toResponse(ConstraintViolationException ex) {
        List<String> errors = ex.getConstraintViolations().stream()
            .map(cv -> cv.getPropertyPath() + ": " + cv.getMessage())
            .collect(Collectors.toList());

        return Response.status(Response.Status.BAD_REQUEST)
                       .entity(errors)
                       .build();
    }
}

四、三者整合示例:用户注册服务

@Path("/register")
@RequestScoped
public class RegistrationResource {

    @Inject
    private UserRepository repo;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response register(@Valid User user) {
        repo.save(user);
        return Response.status(201).entity("User registered!").build();
    }
}

完整依赖:

<dependencies>
    <!-- CDI -->
    <dependency>
        <groupId>jakarta.enterprise</groupId>
        <artifactId>jakarta.enterprise.cdi-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>

    <!-- JPA -->
    <dependency>
        <groupId>jakarta.persistence</groupId>
        <artifactId>jakarta.persistence-api</artifactId>
        <version>3.1.0</version>
    </dependency>

    <!-- Bean Validation -->
    <dependency>
        <groupId>jakarta.validation</groupId>
        <artifactId>jakarta.validation-api</artifactId>
        <version>3.0.2</version>
    </dependency>

    <!-- Hibernate Validator 实现 -->
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>8.0.1.Final</version>
    </dependency>

    <!-- H2 数据库(开发用) -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>2.2.224</version>
    </dependency>
</dependencies>

五、小结

技术规范主要功能常用场景
CDI类型安全依赖注入,生命周期管理控制反转、组件解耦
JPAORM 映射、JPQL 查询数据持久化、实体建模
Bean Validation表达式级校验、嵌套验证表单验证、REST 请求验证

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页