【问题标题】:Spring returns Resource in pure JSON not in HAL Format when including spring data rest包含弹簧数据休息时,弹簧以纯 JSON 而非 HAL 格式返回资源
【发布时间】:2015-04-22 18:17:49
【问题描述】:

当我为我的实体使用由 Spring Data Rest 提供的默认控制器时,一切正常。输出如下所示:

{
  "_links" : {
    "search" : {
      "href" : "http://localhost:8080/users/search"
    }
  },
  "_embedded" : {
    "users" : [ {
      "firstName" : "Max",
      "lastName" : "Mustermann",
      "email" : "mail@max-mustermann.de",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/users/myadmin"
        }
      }
    } ]
  }
}

但如果我使用自己的控制器,输出如下所示:

[ {
  "firstName" : "Max",
  "lastName" : "Mustermann",
  "email" : "mail@max-mustermann.de",
  "links" : [ {
    "rel" : "self",
    "href" : "http://localhost:8080/user/myadmin"
  } ]
} ]

我的控制器

@RestController
@RequestMapping("/user")
@EnableHypermediaSupport(type = {HypermediaType.HAL})
public class UserController {

    @Autowired
    UserRepository userRepository;

    @RequestMapping(method=RequestMethod.GET)
    public HttpEntity<List<User>> getUsers(){
        ArrayList<User> users = Lists.newArrayList(userRepository.findAll());
        for(User user : users){
            user.add(linkTo(methodOn(UserController.class).getUser(user.getUsername())).withSelfRel());
        }
        return new ResponseEntity<List<User>>(users, HttpStatus.OK);
    }

    @RequestMapping(value="/{username}", method= RequestMethod.GET)
    public HttpEntity<User> getUser(@PathVariable String username){
        User user = userRepository.findByUsername(username);
        user.add(linkTo(methodOn(UserController.class).getUser(user.getUsername())).withSelfRel());
        return new ResponseEntity<User>(user, HttpStatus.OK);
    }
}

我的用户:

@Entity
@Table(name="users")
public class User extends ResourceSupport{
    @Id
    private String username;

    private String firstName;
    private String lastName;

    @JsonIgnore
    private boolean enabled;

    @JsonIgnore
    private String password;

    @Column(unique =  true)
    private String email;

    public User(){
        enabled = false;
    }
    //Getters and Setters
}

如果我删除 spring data rest 依赖项并包含 spring-hateoas、spring-plugin-core 和 json-path (com.jayway.jsonpath) 它可以工作。但我想将 spring-data-rest 用于其他一些实体

两个问题:

  1. 为什么 HAL 不是默认包含 spring data rest 的?
  2. 如何将 HAL 设置为输出格式

【问题讨论】:

    标签: java json spring spring-data-rest hal-json


    【解决方案1】:

    您需要返回 ResourceSupport 的子类型(通常是 ResourceResources)才能让 HAL Jackson 转换器启动。

    另外,@EnableHypermediaSupport 必须用于 JavaConfig 配置类,而不是控制器。

    【讨论】:

    • 嗨,在我在这里看到的示例中:spring.io/guides/gs/rest-hateoas 用户必须扩展 ResourceSupport。它是否正确?我将用户添加到我的示例中。
    • 我在@EnableHypermediaSupport上添加了一个观察。
    • @YannicKlem 你需要返回一个 ResourceSupport 的子类型也意味着你不能返回一个普通的List
    • @zeroflagL 返回集合的解决方案是什么?创建一个扩展 ResourceSupport 的自己的集合?
    • @YannicKlem 您可以将List 包装成Resources 对象:new Resources&lt;User&gt;(users)
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2018-05-01
    • 2014-02-28
    相关资源
    最近更新 更多