2015-11-03 51 views
2

我使用春天mvc和仇恨建立一个宁静的api。以前,我用仇恨的方式使用了spring boot,服务器按照我的预期提供了响应。现在,我没有使用spring引导,服务器不能正确呈现响应。从我的研究中,我发现一些人在谈论涉及消息转换器配置的解决方案。因此,除了注释@EnableHypermediaSupport,还需要在没有弹簧启动的情况下设置媒体类型HAL?HAL与春天Hateoas和Mvc(没有引导)

ApiConfiguration.java:

@Configuration 
@ComponentScan 
@EnableWebMvc 
@EnableHypermediaSupport(type = { HypermediaType.HAL }) 
public class ApiConfiguration { 
} 

ApiInitializer.java:

public class ApiInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return null; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[] { ApiConfiguration.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

}

的pom.xml:

... 
<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-framework-bom</artifactId> 
      <version>4.2.0.RELEASE</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.hateoas</groupId> 
     <artifactId>spring-hateoas</artifactId> 
     <version>0.19.0.RELEASE</version> 
    </dependency> 
    ... 

AdaptationRestController.java:

@RestController 
@ExposesResourceFor(Adaptation.class) 
@RequestMapping(value = "/adaptations") 
public class AdaptationRestController { 

    ... 
    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = "application/vnd.xpto-adaptation+json") 
    public ResponseEntity<AdaptationResource> getAdaptation(@PathVariable("id") String adaptationId) { 
     Adaptation adaptation = adaptationGateway.getAdaptation(adaptationId); 
     AdaptationResource adaptationResource = adaptationResourceAssembler.toResource(adaptation); 

     return new ResponseEntity<AdaptationResource>(adaptationResource, HttpStatus.OK); 
    } 
} 

AdaptationResource.java:

public class AdaptationResource extends Resource<Adaptation> { 

    public AdaptationResource(Adaptation adaptation) { 
     super(adaptation); 
    } 

} 

我能得到什么:

"links": [ 
    { 
     "rel": "self", 
     "href": "http://xpto.com" 
    } 
], 
... 

什么应该是:

"_links": { 
    "self": {"href": "http://xpto.com"} 
}, 
... 
+0

你是不是说什么意思?你期望什么,你会得到什么?春季引导添加像杰克逊这样的依赖关系,这可能会发挥魔力。 –

+0

我编辑了我的问题,包括我得到的和我期望的。我已经试图包含以下依赖项,并且问题依然存在:json-path,jackson-databind,jackson-core和jackson-annotations –

+0

好奇,不想使用Spring Boot的原因是什么? – code

回答

0

如果你使用Spring数据JPA数据访问,您可以通过添加来声明性地启用其Web支持。这将为Controller方法注册一堆ArgumentResolvers。简单地说,你可以添加PagedResourcesAssembler参数的方法和使用其toResource方法转换Page版实体资源,如:

@RequestMapping(method = GET) 
    public ResponseEntity getAll(PagedResourcesAssembler ass) { 
     Page<User> users = userRepository.findAll(new PageRequest(0, 10)); 
     PagedResources pagedResources = ass.toResource(users, assembler); 

     return ok(pagedResources); 
    } 

与此JSON输出:

{"_embedded":{...},"_links":{"self":{"href":"http://localhost:8080/users"}},"page":{...}} 
+0

我没有在我的项目中使用数据访问。无论如何,我尝试添加注释EnableSpringDataWebSupport和json保持不变。 –

+0

你有没有想过这个?从Spring Boot迁移到Spring后,我也面临这个问题。 – mancini0

0

的选择是让你的模型扩展org.springframework.hateoas.ResourceSupport

public class MyModelClass extends ResourceSupport 

然后

@RequestMapping(value="/myresource", method=RequestMethod.GET) 
public ResponseEntity<Iterable<MyModelClass>> getAll() { 
Iterable<MyModelClass> all= repository.findAll(); 
for(MyModelClass p : all) { 
p.add(linkTo(methodOn(MyController.class).getAll()).slash(p.getId()).withSelfRel()); 
} 
return new ResponseEntity<>(all, HttpStatus.OK); 
} 
+0

我正在那样做。我编辑了问题以包含控制器和资源实体。 –

0

基本上我使用EntityLinks来建立链接,没有从任何框架相关类扩展我的Pojo。

@RestController 
@ExposesResourceFor(ProjectServiceResponse.class) 
public class ProjectController { 
    @Autowired 
    private org.springframework.hateoas.EntityLinks entityLinks; 

    public HttpEntity<Resource<ProjectServiceResponse>> get(...){ 
    Resource resource = new Resource<ProjectServiceResponse>(response); 
    resource.add(entityLinks.linkToCollectionResource(ProjectServiceResponse.class).withSelfRel()); 
    return new ResponseEntity<Resource<ProjectServiceResponse>>(resource, HttpStatus.OK); 
    } 
} 

响应:

"_links": { 
"self": { 
    "href": "http://localhost:8080/project" 
} 

在我上面的代码ProjectServiceResponse.class是POJO。

你可以参考完整的项目github

+0

这个想法是一样的。我刚刚实现了一个扩展Resource <...>的额外类,以避免泛型的所有冗长,并实现了一个汇编程序类,它使用来自域实体的链接构建资源。你正在使用Spring Boot。当我在代码中使用Spring Boot时,我没有任何问题。当我删除Spring Boot时,转换为HAL不起作用。 –