2017-03-07 29 views
2

我正在使用Spring HATEOAS 0.20(也试过0.23),并且在返回单个对象时出现非常奇怪的行为对象数组。当返回单个对象,所得到的JSON返回经由HAL规范格式化HATEOAS链接(“_links”,我不想):Spring HATEOAS链接返回单个对象的HAL格式,以及对象数组的规格格式

{ 
    "_Id": 161, 
    ... 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/library/161" 
    } 
    } 
} 

当返回对象的数组,所得到的JSON返回HATEOAS在规范格式的链接(“链接”,这一点我想):

[ 
    { 
    "_Id": 277, 
    ... 
    "links": [ 
     { 
     "rel": "self", 
     "href": "http://localhost:8080/library/277" 
     } 
    ] 
    } 
] 

我没有指定@EnableHypermediaSupport,所以HAL不应支持。但是,当我返回单个对象时,我仍然使用HAL格式。

有谁知道为什么会发生这种情况? 需要做什么才能通过HATEOAS规范返回带有HATEOAS链接的单个对象?

=====更新到后根据征求更多信息=====

如果我使用下面的代码返回JSON负载,我得到的HAL链接:

// 
//------------------- Get Single Membership As Single Object ---------------------------------------------- 
// 
@PreAuthorize("hasRole('ROLE_ADMIN')") 
@RequestMapping(value = REQUEST_GET_MEMBERSHIP, method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE }) 
public ResponseEntity<MembershipResource> getMembership(@PathVariable("membership-id") Integer membershipId) { 
    Membership membership = membershipRepository.findOne(membershipId); 

    if (membership == null) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("error", "Membership with ID of " + membershipId + " does not exist."); 
     return new ResponseEntity<MembershipResource>(headers, HttpStatus.NOT_FOUND); 
    } 

    MembershipResourceAssembler assm = new MembershipResourceAssembler(); 
    MembershipResource membershipResource = assm.toResource(membership); 

    System.out.println("membership id: " + membership.getId()); 
    return new ResponseEntity<MembershipResource>(membershipResource, HttpStatus.OK); 
} 

以上会产生HAL规格链接样式:

{ 
    "_Id": 277, 
    "member": { 
    "_Id": 112, 
    "title": "Mr.", 
    "firstName": "ABC", 
    "middleName": "", 
    "lastName": "XYZ", 
    "active": true, 
    "_links": { 
     "self": { 
     "href": "http://localhost:8080/members/112" 
     } 
    } 
    }, 
    "membershipTermType": "2016", 
    "card": { 
    "_Id": 27, 
    "name": "27", 
    "graphicUrl": "", 
    "number": 27, 
    }, 
    "active": false, 
    "paid": true, 
    "renewal": true, 
    "termsAndConditionsAcknowledged": true, 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/memberships/277" 
    } 
    } 
} 

如果我修改方法返回单个成员的名单,返回JSON负载是HATEOAS规格链接:

以上会产生HATEOAS规格的链接样式
// 
//------------------- Get Single Membership As List -------------------------------------------------------- 
// 
@PreAuthorize("hasRole('ROLE_ADMIN')") 
@RequestMapping(value = REQUEST_GET_MEMBERSHIP, method = RequestMethod.GET, produces = { MediaType.APPLICATION_JSON_VALUE }) 
public ResponseEntity<List<MembershipResource>> getMembership(@PathVariable("membership-id") Integer membershipId) { 
    Membership membership = membershipRepository.findOne(membershipId); 

    if (membership == null) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.add("error", "Membership with ID of " + membershipId + " does not exist."); 
     return new ResponseEntity<List<MembershipResource>>(headers, HttpStatus.NOT_FOUND); 
    } 

    MembershipResourceAssembler assm = new MembershipResourceAssembler(); 
     MembershipResource membershipResource = assm.toResource(membership); 

    ArrayList<MembershipResource> list = new ArrayList<MembershipResource>(); 
    list.add(membershipResource); 

    System.out.println("membership id: " + membership.getId()); 
    return new ResponseEntity<List<MembershipResource>>(list, HttpStatus.OK); 
} 

[ 
    { 
    "_Id": 277, 
    "member": { 
     "_Id": 112, 
     "title": "Mr.", 
     "firstName": "ABC", 
     "middleName": "", 
     "lastName": "XYZ", 
     "active": true, 
     "links": [ 
     { 
      "rel": "self", 
      "href": "http://localhost:8080/members/112" 
     } 
     ] 
    }, 
    "membershipTermType": "2016", 
    "card": { 
     "_Id": 27, 
     "name": "27", 
     "graphicUrl": "", 
     "number": 27, 
     "links": [] 
    }, 
    "active": false, 
    "renewal": true, 
    "paid": true, 
    "termsAndConditionsAcknowledged": true, 
    "links": [ 
     { 
     "rel": "self", 
     "href": "http://localhost:8080/memberships/277" 
     } 
    ] 
    } 
] 

有谁知道为什么会发生? 需要做什么才能通过HATEOAS规范返回带有HATEOAS链接的单个对象?

+0

当你要求时你会得到HAL。你的请求如何?和你的控制器方法? – zeroflagL

+0

@zeroflagL - 我修改了我的帖子来回答你的问题。谢谢! – shermantech

+0

不同的行为很可能源自这样的事实:在一种情况下,返回'ResourceSupport'的实例,而在另一种情况下则不是(只有'List')。你使用Spring Boot吗? – zeroflagL

回答

1

由于我使用Spring Boot作为我的应用程序服务器,@zeroflagL建议我尝试在您的应用程序中添加@EnableAutoConfiguration(exclude = HypermediaAutoConfiguration.class)或在您的属性文件中添加spring.hateoas.use-hal-as-default-json-media-type=false

@EnableAutoConfiguration(exclude = HypermediaAutoConfiguration.class)的配置注释添加到我的应用程序类中修复了问题。

+0

我无法得到这个使用弹簧引导1.4.3.RELEASE工作。有什么想法吗? –

+0

也验证它不适用于1.5.7.RELEASE –