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
相关产品推荐
相关产品推荐

