Spring 无法识别数据 REST @Idclass
Spring Data REST @Idclass not recognized
我有一个名为 EmployeeDepartment 的实体,如下所示
@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> {
}
此外,我注册了一个转换器,可以将 String 转换为 EmployeeDepartmentPK。
现在,对于一个由 ID employeeID="abc123" 和 departmentCode="JBG" 限定的实体,我希望在调用 SDR 接口时使用的 ID 是 abc123_JBG。
例如 http://localhost/EmployeeDepartment/abc123_JBG 应该为我获取结果,确实如此。
但是,当我尝试使用 PUT 保存实体时,Spring Data Commons 的 BasicPersistentEntity class 中可用的 ID 属性 的值为
abc123_JBG 部门代码。这是错误的。我不确定这是否是预期的行为。
请帮忙。
谢谢!
目前Spring Data REST 仅支持由单个字段表示的复合键。这实际上意味着仅支持 @EmbeddedId
。我已经提交 DATAJPA-770 来解决这个问题。
如果您可以切换到 @EmbeddedId
,您仍然需要教 Spring Data REST 您希望在 URI 中表示复杂标识符的方式以及如何将路径段转换回你的 id 类型的一个实例。为此,实现一个 BackendIdConverter
并将其注册为 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);
}
}
如果您不能使用@EmbeddedId
,您仍然可以使用@IdClass
。为此,您需要 Oliver Gierke 回答的 BackendIdConverter,但您还需要为您的域类型添加一个 Lookup:
@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);
}
}
使用@BasePathAwareController
自定义Spring数据休息控制器。
@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
我有一个名为 EmployeeDepartment 的实体,如下所示
@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> {
}
此外,我注册了一个转换器,可以将 String 转换为 EmployeeDepartmentPK。
现在,对于一个由 ID employeeID="abc123" 和 departmentCode="JBG" 限定的实体,我希望在调用 SDR 接口时使用的 ID 是 abc123_JBG。 例如 http://localhost/EmployeeDepartment/abc123_JBG 应该为我获取结果,确实如此。
但是,当我尝试使用 PUT 保存实体时,Spring Data Commons 的 BasicPersistentEntity class 中可用的 ID 属性 的值为 abc123_JBG 部门代码。这是错误的。我不确定这是否是预期的行为。
请帮忙。
谢谢!
目前Spring Data REST 仅支持由单个字段表示的复合键。这实际上意味着仅支持 @EmbeddedId
。我已经提交 DATAJPA-770 来解决这个问题。
如果您可以切换到 @EmbeddedId
,您仍然需要教 Spring Data REST 您希望在 URI 中表示复杂标识符的方式以及如何将路径段转换回你的 id 类型的一个实例。为此,实现一个 BackendIdConverter
并将其注册为 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);
}
}
如果您不能使用@EmbeddedId
,您仍然可以使用@IdClass
。为此,您需要 Oliver Gierke 回答的 BackendIdConverter,但您还需要为您的域类型添加一个 Lookup:
@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);
}
}
使用@BasePathAwareController
自定义Spring数据休息控制器。
@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