当前位置: 首页 > 知识库问答 >
问题:

Spring Data Rest-_Links

令狐良骏
2023-03-14

编辑14/08/14 13:29

我的下一个结论是,从我的@RepositoryRestResource CrudRepository生成的HAL+JSON格式是不正确的。

{
   "_links" : {
       "people" : {
           "href" : "http://localhost:8080/people{?page,size,sort}"
       }
   }
 }
{
    "links" : [ {
        "rel" : "customer",
        "href" : "http://localhost:8080/customer"
      }, {
         "rel" : "profile",
         "href" : "http://localhost:8080/profile"
      }
 }

编辑14/08/14:我的调试又进了一步。通过提供我自己的org.springframework.hateoas.ResourceSupport类的实现(它检查json中的“_links”而不是“links”),我就更进一步了。错误是:

“无法从START_OBJECT标记反序列化java.util.ArrayList实例。....通过引用链:com.ebs.solas.admin.test.SolicitorDto[\"_links\"]”

这是因为org.springframework.hateoas.ResourceSupport类似乎要求links属性是一个json数组。默认情况下,Spring Data为Rest实体生成的JSON+HAL输出不生成数组(没有方括号):

"_links" : {
  "self" : {
    "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx"
  },
  "solicitors" : {
    "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/Fxxx/solicitor
  }
}

希望Spring论坛的人能在这里帮助我。

=================================================

请查看我的Spring数据存储库代码的概要:

@RepositoryRestResource
    public interface SolicitorFirmRepository extends CrudRepository<SolicitorFirm, String> {
}

@Entity
@RestResource
@Table(name="XXXX", schema = "XXX")
public class SolicitorFirm implements Serializable {
}
{
"firmNumber" : "FXXXX",
"solicitorType" : "r",
"companyName" : "XXXX",
"address1" : "XXXX",
"address2" : "XXX",
"address3" : "XXX",
"address4" : null,
"phoneNumber" : "XXXXX",
"faxNumber" : "XXXXX",
"county" : "OY",
"_links" : {
    "self" : {
        "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX"
    },
    "solicitors" : {
        "href" : "http://localhost:9090/solas-admin-data-api/solicitorFirms/XXXX/solicitors"
    }
 }
import org.springframework.hateoas.ResourceSupport;
public class SolicitorFirmDTO extends ResourceSupport {
   .....
}
RestTemplate rt = new RestTemplate();
String uri = new String("//xxxxx:9090/solas-admin-data-api/solicitors/Sxxxxx");
SolicitorFirmDTO u = rt.getForObject(uri, SolicitorFirmDTO.class, "SXXXX");

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“_links”(类com.ebs.solas.admin.test.SolicitorFirmdTo),未标记为可忽略(7个已知属性:xx])

出于某种原因,Spring Data Rest生成的json在_links下添加实体链接,而HATEOAS资源超类则期望links

有人能帮忙吗?这是版本问题,还是需要一些额外的配置来将_links映射到links

我尝试了MappingJackson2HttpMessageConverter和各种媒体类型application/json+hal,但没有成功。

共有1个答案

党佐
2023-03-14

对于Spring-boot 1.3.3,用于List的方法exchange()正在工作

public void test1() {

    RestTemplate restTemplate = restTemplate();

    ParameterizedTypeReference<PagedResources<User>> responseTypeRef = new ParameterizedTypeReference<PagedResources<User>>() {
    };

    String API_URL = "http://localhost:8080/api/v1/user"
    ResponseEntity<PagedResources<User>> responseEntity = restTemplate.exchange(API_URL, HttpMethod.GET,
            (HttpEntity<User>) null, responseTypeRef);

    PagedResources<User> resources = responseEntity.getBody();
    Collection<User> users = resources.getContent();
    List<User> userList = new ArrayList<User>(users);

    System.out.println(userList);

}

private RestTemplate restTemplate() {

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    mapper.registerModule(new Jackson2HalModule());

    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(MediaType.parseMediaTypes("application/hal+json"));
    converter.setObjectMapper(mapper);

    List<HttpMessageConverter<?>> converterList = new ArrayList<HttpMessageConverter<?>>();
    converterList.add(converter);
    RestTemplate restTemplate = new RestTemplate(converterList);

    return restTemplate;
}
 类似资料:
  • 我尝试使用MockMVC和TestRestTemboard。在这两种情况下,返回的响应都是404,但是APIendpoint在集成测试之外工作(当我自己运行Spring应用时)。 有没有人有一个可以工作的示例应用程序,它使用SpringDataREST对生成的控制器进行了工作集成测试? 我还可以编写针对自己控制器的常规集成测试(非SDR类型) 测试代码: 回购: 好的,我发现了问题,但我不知道答案

  • 我不想公开我的模型类(jpa实体),而是用不同的数据传输对象(DTO)公开它们属性的不同子集。这个想法是不切实际的 例子: 实体: JpaRepository: DTO: D到积垢积存物: 实施: 一般: 在本例中,我想用Spring数据REST公开GroupDtoDao。 在其他bean中,我可以自动连接GroupDto和GroupDto,所以两者都由Spring的上下文管理。如果我不使用@Re

  • 正如我们所知,在SpringDataRest中,存储库文件只被使用(而不是控制器),我们可以为它使用内置方法。 我不想添加自定义方法,并在那里添加我的请求处理逻辑。我想要一些配置或事件重写,在这里我可以处理HttpRequest处理程序,解析令牌并检查令牌中的一些数据,根据该令牌,我将决定要么处理该请求,要么放弃它,但出现一些错误。 谢了。

  • 问题内容: 我正在尝试开发非常简单的json网络服务,以返回这种形式的数据: 如您所见,这非常简单。我的POJO扩展了ResourceSupport,因此解析链接没有问题。它们是这样的: UsersJson(根元素) 用户杰森 事实是,我期望jackson和spring足够聪明,可以解析_embedded属性并填充我的UsersJson.users属性,但事实并非如此。 我尝试了在互联网上发现的各

  • 我对Spring数据Rest与Spring数据JPA一起使用有一个问题。我使用的是Spring boot 1.4.4。释放 我的rest spring数据存储库在这里: 这里没有显示我的setters和bregetter。 轮廓爪哇: 属性JAVA “上的帖子”http://localhost:8880/profiles“要创建实体: 这是我击球时的结果http://localhost:8880/

  • 下面是我的spring-data-rest存储库: 下面是我的实体(为简洁起见,没有显示getter和setter)。 profile.java: 有关依赖关系版本的更多信息可以在这里找到。如果需要,我没有重写这些(http://docs.spring.io/spring-boot/docs/1.4.4.release/reference/html/appendience-dependency-v

相关文章

相关阅读