当前位置: 首页 > 知识库问答 >
问题:

无法识别Spring数据REST@Idclass

阴焱
2023-03-14

我有一个名为员工部的实体如下

@IdClass(EmployeeDepartmentPK.class) //EmployeeDepartmentPK is a serializeable object
@Entity
EmployeeDepartment{

@Id
private String employeeID;

@Id
private String departmentCode;
---- Getters, Setters and other props/columns
}

我有一个Spring数据存储库,定义如下

@RepositoryRestResource(....)
public interface IEmployeeDepartmentRepository extends PagingAndSortingRepository<EmployeeDepartment, EmployeeDepartmentPK> {

}

此外,我注册了一个转换器,用于将字符串转换为EmployeeDepartmentPK。

现在,对于一个由ID employeeID=“abc123”和departmentCode=“JBG”限定的实体,我希望在调用SDR接口时使用的ID是abc123u JBG。例如http://localhost/EmployeeDepartment/abc123_JBG应该能给我带来结果,确实如此。

但是,当我试图使用PUT保存一个实体时,Spring Data Commons的BasicPeristentEntity类中可用的ID属性的值为departmentCode的abc123_JBG。这是错误的。我不确定这是否是预期的行为。

请帮忙。

谢谢!

共有3个答案

孙思源
2023-03-14

使用@BasePathAware Controller定义Spring数据Rest控制器。

    @BasePathAwareController
    public class CustInfoCustAcctController {

    @Autowired
    CustInfoCustAcctRepository cicaRepo;

    @RequestMapping(value = "/custInfoCustAccts/{id}", method = RequestMethod.GET)
    public @ResponseBody custInfoCustAccts getOne(@PathVariable("id") String id) {
        String[] parts = id.split("_");
        CustInfoCustAcctKey key = new CustInfoCustAcctKey(parts[0],parts[1]);
        return cicaRepo.getOne(key);
    }
}

它的工作正常,我与样本uri/api/CustInfoCustAccts/89232_70

宗安宁
2023-03-14

如果不能使用@EmbeddedId,您仍然可以使用@IdClass。为此,正如Oliver Gierke所回答的,您需要BackendIdConverter,但您还需要为您的域类型添加查找:

@Configuration
public class IdClassAllowingConfig extends RepositoryRestConfigurerAdapter {

@Override
public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.withEntityLookup().forRepository(EmployeeDepartmentRepository.class, (EmployeeDepartment ed) -> {
        EmployeeDepartmentPK pk = new EmployeeDepartmentPK();
        pk.setDepartmentId(ed.getDepartmentId());
        pk.setEmployeeId(ed.getEmployeeId());
        return pk;
    }, EmployeeDepartmentRepository::findOne);
}

}

郭志泽
2023-03-14

目前,Spring Data REST只支持由单个字段表示的复合键。这实际上意味着只支持@EmbeddedId。我已经提交了JPA-770数据来解决这个问题。

如果您可以切换到@EmBeddedId,您仍然需要教Spring Data REST如何在URI中表示您的复杂标识符,以及如何将路径段转换回您的id类型的实例。要实现这一点,请实现一个BackendIdConader并将其注册为Spring bean

@Component
class CustomBackendIdConverter implements BackendIdConverter {

  @Override
  public Serializable fromRequestId(String id, Class<?> entityType) {

    // Make sure you validate the input

    String[] parts = id.split("_");
    return new YourEmbeddedIdType(parts[0], parts[1]);
  }

  @Override
  public String toRequestId(Serializable source, Class<?> entityType) {

    YourIdType id = (YourIdType) source;
    return String.format("%s_%s", …);
  }

  @Override
  public boolean supports(Class<?> type) {
    return YourDomainType.class.equals(type);
  }
}
 类似资料:
  • 问题内容: 我有一个名为EmployeeDepartment的实体,如下所示 我有一个如下定义的Spring Data Repository 此外,我注册了一个转换器,以将String转换为EmployeeDepartmentPK。 现在,对于一个由ID employeeID =“ abc123”和departmentCode =“ JBG”限定的实体,我希望在调用SDR接口时使用的ID为abc1

  • 我已经使用注释配置了Spring Boot。我有以下文件:1)用于配置spring boot的AppStarter类

  • 当我尝试使用以下命令将数据发布到我的REST API(使用Spring DATA JPA REST创建)时: 我得到这个错误:

  • 我正在尝试使用以下REST HAL响应中的实体列表: 我想将这些实体映射到此类: 然而,我不断发现错误: 无法识别的字段“_embedded”(类org.springframework.hateoas.PagedModel),未标记为可忽略(3个已知属性:“链接”、“页面”、“内容”]) 使用此代码: 版本包括: Jackson数据绑定版本:2.11.0 Spring-hateoas版本:1.0.

  • 我试图从我的jar启动另一个Java进程,我使用的是ProcessBuilder: 错误:无法创建Java虚拟机。错误:发生致命异常。程序将退出。无法识别的选项:-类路径“C:\absoulte\path\library.jar;C:\absoulte\path2\library2.jar;C:\absoulte\path3\library3.jar”

  • 我有一个用Java编写的SQL查询,如下所示: 是否可以发送值,将其转换为,并使其在雪花中工作?