You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring HATEOAS Hal Forms模板未展示GET端点及移除templated=true问题

问题1:GET类型affordance未渲染到Hal Forms的_templates节点

原因

Spring HATEOAS对application/prs.hal-forms+json媒体类型的默认序列化规则中,不会将GET方法的affordance输出到_templates节点,官方默认认为GET请求的参数已经通过URI模板(即href中的{?xxx}占位符)完整表达,无需重复生成模板。

解决方案

自定义Hal Forms全局配置,开启GET模板的渲染开关,配置代码如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.hateoas.mediatype.hal.forms.HalFormsConfiguration;

@Configuration
public class CustomHalFormsConfig {
    @Bean
    public HalFormsConfiguration halFormsConfiguration() {
        return HalFormsConfiguration.builder()
                // 开启GET方法affordance渲染到_templates节点
                .includeGetTemplates(true)
                .build();
    }
}

配置生效后,你定义的所有GET类型affordance都会正常出现在_templates中。

问题2:移除Link节点的templated: true属性

原因

当Link的href中存在URI模板占位符(如{?personId,bankingId})时,Spring HATEOAS会自动识别为模板链接,追加templated: true属性。

解决方案

根据你的使用场景二选一:

  • 场景1:不需要保留href中的参数占位符,直接返回固定路径
    构造Link时直接传入固定路径字符串即可,示例:
    Link link = Link.of("http://localhost:8081/clientData/contact/some-participants").withSelfRel();
    
    没有占位符的链接不会自动生成templated属性。
  • 场景2:需要保留href中的参数占位符,仅隐藏templated属性
    自定义Link序列化逻辑,屏蔽templated字段的输出,配置代码如下:
    import com.fasterxml.jackson.core.JsonGenerator;
    import com.fasterxml.jackson.databind.SerializerProvider;
    import com.fasterxml.jackson.databind.module.SimpleModule;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.hateoas.Link;
    import org.springframework.hateoas.mediatype.hal.Jackson2HalModule;
    
    import java.io.IOException;
    
    @Configuration
    public class CustomHalSerializerConfig {
        @Bean
        public SimpleModule customLinkSerializer() {
            SimpleModule module = new SimpleModule();
            module.addSerializer(Link.class, new Jackson2HalModule.HalLinkSerializer() {
                @Override
                public void serialize(Link link, JsonGenerator gen, SerializerProvider provider) throws IOException {
                    gen.writeStartObject();
                    gen.writeStringField("href", link.getHref());
                    // 如需保留hreflang、title等其他Link属性,可在此处追加输出逻辑
                    gen.writeEndObject();
                }
            });
            return module;
        }
    }
    

内容的提问来源于stack exchange,提问作者user3111411

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:18:02