如何使用注解控制 Java Map 的条目数量(大小)

轻枫吖_2099

轻枫吖_2099

2026-10-31

363人浏览

原创

如何使用注解控制 Java Map 的条目数量(大小)

Java Bean Validation 的 @Size 注解无法直接约束 Map 的条目数,因其作用于整个 Map 对象而非内部 entry 集合;需结合自定义校验逻辑或 JAXB 绑定配置实现对 entry 数量的精确控制。

java bean validation 的 `@size` 注解无法直接约束 map 的条目数,因其作用于整个 map 对象而非内部 entry 集合;需结合自定义校验逻辑或 jaxb 绑定配置实现对 entry 数量的精确控制。

在 Java 中,@Size(max = N) 注解常用于限制集合类(如 List、Set)的元素个数,但当应用于 Map 类型时,其语义是约束 Map 实例本身(即该字段是否为 null 或非空),而非其内部键值对(entry)的数量。这正是你遇到问题的根本原因:JAXB 生成的 XSD 中 的 maxOccurs="2" 表示该 XML 元素最多可出现 2 次(即允许两个独立的 标签),而非表示该 Map 最多含 2 个 entry —— 这显然不符合业务需求。

✅ 正确方案:分层控制 + 显式校验

1. 使用 @Size 仅作基础非空/长度提示(有限效用)

@XmlElement
@Size(max = 2, message = "Map entries must not exceed 2")
public Map<myothertypeenum myothertype> getMyothertypes() {
    return myothertypes;
}</myothertypeenum>

⚠️ 注意:此写法不会触发运行时 entry 数量校验,仅在部分验证框架(如 Hibernate Validator)对 Map 调用 size() 时才生效,但 JAXB 默认不执行该验证,因此不可靠。

2. 推荐方案:自定义 getter + 主动校验(稳定可靠)

通过在 getter 中显式检查 map.size() 并抛出语义明确的异常,确保序列化/反序列化前强制约束:

@XmlElement(name = "myothertypes")
public Map<myothertypeenum myothertype> getMyothertypes() {
    // 强制校验:Map 条目数 ≤ 2
    if (myothertypes != null && myothertypes.size() > 2) {
        throw new IllegalStateException(
            String.format("Map 'myothertypes' size (%d) exceeds maximum allowed: 2", 
                          myothertypes.size())
        );
    }
    return myothertypes;
}

// 建议配套提供 setter 进行同步校验
public void setMyothertypes(Map<myothertypeenum myothertype> myothertypes) {
    if (myothertypes != null && myothertypes.size() > 2) {
        throw new IllegalArgumentException("Map size must not exceed 2 entries");
    }
    this.myothertypes = myothertypes;
}</myothertypeenum></myothertypeenum>

3. JAXB 层面:通过 @XmlJavaTypeAdapter 定制映射(进阶控制)

若需在 XSD 中精准表达 “最多 2 个 entry”,需绕过默认 Map 映射,改用封装类:

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载
// 封装类:显式限定 entry 数量
public static class LimitedMapAdapter 
    extends XmlAdapter<limitedmapadapter.adaptedmap map myothertype>> {

    public static class AdaptedMap {
        @XmlElement(name = "entry")
        @Size(max = 2) // ✅ 此处 @Size 有效作用于 entry 列表
        public List<entry> entries = new ArrayList();

        public static class Entry {
            @XmlElement(name = "key") public MyothertypeEnum key;
            @XmlElement(name = "value") public Myothertype value;
        }
    }

    @Override
    public Map<myothertypeenum myothertype> unmarshal(AdaptedMap v) throws Exception {
        Map<myothertypeenum myothertype> map = new LinkedHashMap();
        for (AdaptedMap.Entry e : v.entries) {
            map.put(e.key, e.value);
        }
        return map;
    }

    @Override
    public AdaptedMap marshal(Map<myothertypeenum myothertype> v) throws Exception {
        AdaptedMap adapted = new AdaptedMap();
        if (v != null) {
            v.forEach((k, v0) -> {
                AdaptedMap.Entry e = new AdaptedMap.Entry();
                e.key = k; e.value = v0;
                adapted.entries.add(e);
            });
        }
        return adapted;
    }
}</myothertypeenum></myothertypeenum></myothertypeenum></entry></limitedmapadapter.adaptedmap>

然后在字段上应用:

@XmlElement
@XmlJavaTypeAdapter(LimitedMapAdapter.class)
public Map<myothertypeenum myothertype> getMyothertypes() { ... }</myothertypeenum>

✅ 优势:XSD 中 的 maxOccurs="2" 将被准确生成,且 @Size 在 AdaptedMap.entries 上真正生效。

⚠️ 关键注意事项

  • @Size 对原生 Map 的校验依赖具体 Validator 实现,JAXB 本身不执行 Bean Validation,需额外集成(如 ValidationEventHandler)。
  • maxOccurs 在 XSD 中修饰的是 XML 元素出现次数,不是 Map 内容大小;理解此区别是解决本问题的前提。
  • 生产环境建议同时启用 getter 校验 + 单元测试断言,避免因框架行为差异导致约束失效。

综上,最实用、兼容性最强的方式是 在 getter/setter 中嵌入显式 size() 检查,辅以清晰的异常信息,既无需引入复杂适配器,又能保证逻辑严谨与调试友好。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

11637

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8742

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

7512

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1244

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

1008

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1476

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

3049

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20311

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1335

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习