Spring 当跟随rel链接时,HAL使用单数名词而不是复数名词链接

Spring 当跟随rel链接时,HAL使用单数名词而不是复数名词链接,spring,spring-data-rest,spring-hateoas,hal-json,Spring,Spring Data Rest,Spring Hateoas,Hal Json,我正在使用Spring Boot(2.1.1)自动创建我的JpaRepository接口的HAL REST API 在大多数情况下,这些接口是空的,例如: public interface ProjectRepository extends JpaRepository<Project, Long> {} public interface ProtocolRepository extends JpaRepository<Protocol, Long> {} 但当我遵循该

我正在使用Spring Boot(2.1.1)自动创建我的
JpaRepository
接口的HAL REST API

在大多数情况下,这些接口是空的,例如:

public interface ProjectRepository extends JpaRepository<Project, Long> {}

public interface ProtocolRepository extends JpaRepository<Protocol, Long> {}
但当我遵循该链接时,会生成所有其他链接:

  ...
  "_links": {
    "self": {
      "href": "http://localhost:8080/admin/project/1"
    },
    "project": {
      "href": "http://localhost:8080/admin/project/1"
    }
  ...
  }
  ...
链接中的错误是使用了单数名词
project
,而不是复数形式
projects


由于这些链接是自动生成的,因此不清楚如何更改此行为。

在调试Spring内部构件时,我发现
PersistentEntityResourcesAssembler
使用
DefaultSelfLinkProvider
的实例来创建自链接。 当我调试该类时,我意识到当为Hibernate代理的对象生成自链接时,该类无法正常工作

因此,我尝试用自己的
SelfLinkProvider
-接口实现来替换
DefaultSelfLinkProvider

这可以通过
BeanPostProcessor
完成:

  @Bean
  public BeanPostProcessor entityManagerBeanPostProcessor()
  {
    return new BeanPostProcessor()
    {
      @Override
      public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
      {
        return bean;
      }

      @Override
      public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
      {
        if (bean instanceof SelfLinkProvider)
        { return new HibernateSelfLinkProvider((SelfLinkProvider) bean); }
        return bean;
      }
    };
  }
HibernateSelfLinkProvider
是一个围绕
SelfLinkProvider
的简单包装器:

public class HibernateSelfLinkProvider implements SelfLinkProvider
{
  private final SelfLinkProvider selfLinkProvider;

  public HibernateSelfLinkProvider(SelfLinkProvider selfLinkProvider)
  {
    this.selfLinkProvider = selfLinkProvider;
  }

  @Override
  public Link createSelfLinkFor(Object instance)
  {
    instance = Hibernate.unproxy(instance);
    return selfLinkProvider.createSelfLinkFor(instance);
  }
}
Hibernate.unproxy()
的好处在于,如果给定对象不是代理对象,它将保持不变

通过此添加,我获得了正确的链接:
“http://localhost:8080/admin/projects/1“
。 但我不确定这是否是修改行为的最佳场所

public class HibernateSelfLinkProvider implements SelfLinkProvider
{
  private final SelfLinkProvider selfLinkProvider;

  public HibernateSelfLinkProvider(SelfLinkProvider selfLinkProvider)
  {
    this.selfLinkProvider = selfLinkProvider;
  }

  @Override
  public Link createSelfLinkFor(Object instance)
  {
    instance = Hibernate.unproxy(instance);
    return selfLinkProvider.createSelfLinkFor(instance);
  }
}