我有一个2个域类,一个引用另一个,如下所示:
@Document
public class Dummy {
@Id
private UUID id;
private String name;
@Reference
private DummyAttribute dummyAttribute;
// getters and setters omitted.
}
@Document
public class DummyAttribute {
@Id
private UUID id;
private String name;
// getters and setters omitted.
}
我还有2个与Dummy和DummyAttribute相对应的存储库。
public interface DummyRepository extends CrudRepository<Dummy, UUID> {
}
public interface DummyAttributeRepository extends
CrudRepository<DummyAttribute, UUID> {
}
我想创建一个Dummy
DummyAttribute
。所以,我通过发布到/dummyattributes
来创建一个dummyAttribute。我得到了一个响应主体,其中包含一个返回dummyAttribute的自我链接。我回来的这个自我链接是在创建Dummy期间使用的。我对/dummies
的JSON有效负载如下:
{
"name" : "dummy",
"dummyAttribute" : <self link of dummyAttribute generated during POST>
}
当我在GET
之后生成的关联网址上POST
时,我正确地得到了
使用的dummyAttribute。到目前为止,在Spring Data REST中运行良好。
我想使用我的自定义控制器做同样的事情。所以,我创建了控制器 适用于Dummy和DummyAttribute。
@RestController
public class DummyController {
@Autowired
private DummyRepository dummyRepository;
@Autowired
private DummyResourceProcessor processor;
@RequestMapping(value = "/dummies", method = RequestMethod.POST)
public HttpEntity<Resource<Dummy>> createTenant(@RequestBody Dummy dummy)
{
Dummy save = dummyRepository.save(dummy);
Resource<Dummy> dummyr = new Resource<Dummy>(save);
return new ResponseEntity<Resource<Dummy>>(processor.process(dummyr),
HttpStatus.CREATED);
}
@RequestMapping(value = "/dummies/{id}", method = RequestMethod.GET)
public HttpEntity<Resource<Dummy>> getDummy(@PathVariable("id") Dummy
dummy) {
Resource<Dummy> dummyr = new Resource<Dummy>(dummy);
return new ResponseEntity<Resource<Dummy>>(processor.process(dummyr),
HttpStatus.OK);
}
@RestController
public class DummyAttributeController {
@Autowired
private DummyRepository dummyRepository;
@Autowired
private DummyAttributeRepository dummyAttributeRepository;
@Autowired
private DummyAttributeResourceProcessor processor;
@RequestMapping(value = "/dummyAttributes", method =
RequestMethod.POST)
public HttpEntity<Resource<DummyAttribute>> createDummyAttribute(
@RequestBody DummyAttribute dummyAttribute) {
DummyAttribute save = dummyAttributeRepository.save(dummyAttribute);
Resource<DummyAttribute> dummyr = new Resource<DummyAttribute>(save);
return new ResponseEntity<Resource<DummyAttribute>>
(processor.process(dummyr),createHeaders(request,save.getId()),
HttpStatus.CREATED);
}
@RequestMapping(value = "/dummyAttributes/{id}", method =
RequestMethod.GET)
public HttpEntity<Resource<DummyAttribute>> getDummyAttribute(
@PathVariable("id") DummyAttribute dummyAttribute) {
Resource<DummyAttribute> dummyr = new Resource<DummyAttribute>
(dummyAttribute);
return new ResponseEntity<Resource<DummyAttribute>>
(processor.process(dummyr), HttpStatus.OK);
}
我按照与上面相同的步骤顺序进行操作。我对dummyAttribute
进行了POST。
使用此自我链接,我尝试创建dummy
。
这次事情并不那么顺利。我得到了这个例外。
Can not instantiate value of type [simple type,
class com.sudo.DummyAttribute] from String value
('http://localhost:8080/dummyAttributes/3fa67f88-f3f9-4efa-a502-
bbeffd3f6025'); no single-String constructor/factory method at
[Source: java.io.PushbackInputStream@224c018a; line: 2, column: 19]
(through reference chain: com.sudo.Dummy["dummyAttribute"])
当我在DummyAttribute中创建构造函数时,我从url解析id并将其分配给id。
public DummyAttribute(String url) {
String attrId = // parse the URL to get the id;
this.id = attrId;
}
现在事情按预期工作。dummyAttribute
已分配给dummy
。
我想知道的是,当我编写自定义控制器时,为什么会有不同之处?我错过了什么?当我使用Spring Data REST时,dummyAttribute
的引用URL被自动解析为相应的dummyAttribute对象,并且在自定义控制器中,我必须手动解析它并将id值明确地分配给{{ 1}?
另外,在我认为的构造函数中,domainAttribute id
没有通过执行findOne从存储库中找到它来解决,但是正在创建新的dummyAttribute
。这是对的吗?
如何使我的自定义控制器的dummyAttribute
与Spring Data REST中的工作原理完全相同?我需要一个自定义序列化器/解串器吗?我是否需要手动注册一些组件并调用它?
我发现当我使用客户控制器并使用@EnableWebMvc时,相关资源无法解析。这导致上面的错误。如果不存在@EnableWebMvc,则正确解析关联的资源。不确定@EnableWebMvc是如何进入的......
我使用的弹簧版本是:spring-boot-starter-1.2.5,spring-boot-starter-data-rest-1.2.5,spring-data-commons-1.9.3。 spring-hateoas-0.16.0,spring-data-rest-core-2.2.3,spring-data-rest-webmvc-2.2.3。