我的自定义Spring RestController中存在一个问题,该问题需要引用spring-data-jpa实体作为其在GET请求中的输入。这是我的代码:
我有一个称为“ AreaModel”的spring数据jpa实体。它只是具有一些String属性:
@Entity
@Table(name = "areas")
public class AreaModel {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
public Long id;
public String title;
public String description;
[...]
}
此JPA实体也通过spring-data-rest作为spring-hateoas rest存储库公开:
@RepositoryRestResource(collectionResourceRel = "areas", path = "areas", itemResourceRel = "area")
public interface AreaRepo extends CrudRepository<AreaModel, Long> {
[...]
}
通过GET和POST到该其余端点的CRUD操作可以正常工作。
但是现在我有了一个需要AreaModel作为其输入的自定义控制器。客户请求一个给定区域的“令牌”。客户只知道该区域的“ HATEOAS ID”。 HATEOAS ID实际上是URI,例如/ myBasePath / areas / 4711
这是我(尚未工作)的自定义休息控制器:
@BasePathAwareController
public class VoteRestController {
@RequestMapping(value = "/getToken")
public @ResponseBody Map getToken(@RequestParam("area")AreaModel area, @AuthenticationPrincipal UserModel user) throws LiquidoException {
log.info(user+" requests a voter token for area "+area);
}
我要开始工作的客户要求是
GET /myBasePath/getToken?area=/myBasePath/areas/4711
我在Spring异常中遇到的错误是:
"exception": "org.springframework.web.method.annotation.MethodArgumentTypeMismatchException",
"message": "Failed to convert value of type 'java.lang.String' to required type 'org.doogie.liquido.model.AreaModel'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Long] for value '/liquido/v2/areas/42'; nested exception is java.lang.NumberFormatException: For input string: \"/liquido/v2/areas/42\"",
"path": "/liquido/v2/getToken"
预期结果
如何将(引用)spring-data-hateos资源作为GET请求的请求参数传递给自定义的rest控制器?