Spring Data REST控制器与自定义控制器

时间:2015-07-06 20:58:41

标签: spring-mvc spring-data spring-data-rest

我有一个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。

0 个答案:

没有答案