programing

JSON에서 HAL(Hypertext Application Language)을 비활성화하시겠습니까?

topblog 2023. 3. 14. 21:21
반응형

JSON에서 HAL(Hypertext Application Language)을 비활성화하시겠습니까?

버전 2.0.2에서 스프링 데이터 REST를 JPA와 함께 사용.풀어주다.

JSON에서 하이퍼텍스트 애플리케이션 언어(HAL)를 비활성화하려면 어떻게 해야 합니까?http://stateless.co/hal_specification.html

나는 이미 많은 것을 시도했지만 소용이 없었다.예를 들어 Accept 및 Content-type 헤더를 application/hal+json이 아닌 application/json으로 설정했는데 하이퍼링크가 있는 JSON 콘텐츠를 수신할 수 있습니다.

예를 들어 다음과 같은 정보를 얻을 수 있습니다.

{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"sector" : {
     "description" : "Marketing",
     "average profit": 545656665,
     "average employees": 75,
     "average profit per employee": 4556
     }
}

대신:

{
"name" : "Foo",
"street" : "street Bar",
"streetNumber" : 2,
"streetLetter" : "b",
"postCode" : "D-1253",
"town" : "Munchen",
"country" : "Germany",
"phone" : "+34 4410122000",
"vat" : "000000001",
"employees" : 225,
"_links" : {
     "self" : {
          "href" : "http://localhost:8080/app/companies/1"
     },
     "sector" : {
          "href" : "http://localhost:8080/app/companies/1/sector"
     }
}
}

도와주셔서 고마워요.

(하이퍼) 미디어 타입

하이퍼미디어 서버는 Data REST에 내용을 반환합니다.Accept★★★★

  • 없음 -> > > >application/hal+json -> HAL
  • application/hal+json->application/hal+json -> HAL
  • application/json->application/json ()-> HAL ( 「」)
  • application/x-spring-data-verbose+json->application/x-spring-data-verbose+json의 형식(-> 를 사용)links 및 " " "에 대한 설명"content수집 항목의 래퍼로 사용합니다.

「」를 .RepositoryRestConfiguration.setDefaultMediaType(…)에서는, 「HAL」, 「Spring Data」의 JSON을 으로 요구하는 경우를 제외하고, 는 스프링 을 반환합니다.application/hal+json물론 설정 옵션이 조금 오해를 일으킬 수 있기 때문에, 이것을 개선하기 위해서 DATAREST-294에 신청했습니다.이 문제는 2014년 2.1 RC1(Dijkstra)에서 해결되었습니다.

관리 대상 자원 간의 관계를 표현하고 서버를 검출할 수 있도록 하기 위해서는 하이퍼미디어 포맷이 필요합니다.그래서 완전히 없앨 수 있는 방법은 없어요.이는 주로 쌍방향 관계를 가진 엔티티를 노출하거나 거대한 객체 그래프를 구성하는 경우 서버를 쉽게 크래시할 수 있기 때문입니다.

관련 엔티티 인라인화

, 은 단순히 입니다.SectorRepositoryREST ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」을 붙이면 이 작업을 수행할 수 .@RepositoryRestResource(exported = false).

아래 예에서 게시한 대로 표현을 되돌리려면 Spring Data REST 2.1 M1에서 도입된 투영 기능을 참조하십시오.기본적으로 이 기능을 사용하면 간단한 인터페이스를 통해 기본 리소스와 다를 수 있는 리소스에 대한 옵션 뷰를 작성할 수 있습니다.

기본적으로 인터페이스를 정의합니다.

@Projection(name = "foo", types = YourDomainClass.class)
interface Inlined {

  // list all other properties

  Sector getSector();
}

으로 등록하는 .RepositoryRestConfiguration.projectionConfiguration()하는 YourDomainClass.projection 안 in in in in in in in in in in in in foo이 예에서는 원하는 대로 삽입된 표현을 렌더링합니다.

커밋에는 일반적으로 기능에 대한 자세한 정보가 포함되어 있으며, 이 커밋에는 예측 예제가 정의되어 있습니다.

두 가지를 원하는군요.

1) 삭제_links 정보
2) 관련 내용 sector 들 field

가능한 해결책(나에게 효과 있음:D)

1) 삭제_links
이를 위해 아래 클래스를 만듭니다.

[... package declaration, imports ...]
public class MyRepositoryRestMvcConfiguration extends RepositoryRestMvcConfiguration {
    public MyRepositoryRestMvcConfiguration(ApplicationContext context, ObjectFactory<ConversionService> conversionService) {
        super(context, conversionService);
    }

    @Bean
    protected LinkCollector linkCollector() {
        return new LinkCollector(persistentEntities(), selfLinkProvider(), associationLinks()) {
            public Links getLinksFor(Object object, List<Link> existingLinks) {
                return new Links();
            }
        };
    }
}

사용 예:

[... package declaration, imports ...]
@SpringBootApplication
@Import({MyRepositoryRestMvcConfiguration.class})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

는 테스트되지 이하기 위해 필요하지 _links관련 엔티티/프로젝트에 대한 다음 포인트 (2)의 표시 방법을 포함합니다.

2) 관련 내용 sector 정보
이 경우 발췌(특히 이 시나리오용으로 작성)를 사용할 수 있습니다.Spring의 예는 매우 웅변적이고 여기에 복사하는 것은 어리석은 일이기 때문에, https://docs.spring.io/spring-data/rest/docs/3.1.x/reference/html/#projections-tempts.tempts-tempts-tempts-data를 지정합니다.
다만, 기록과 편의를 위해서, 스프링의 내용은 다음과 같습니다.

@Projection(name = "inlineAddress", types = { Person.class }) 
interface InlineAddress {
  String getFirstName();
  String getLastName();
  Address getAddress(); 
}

Projection javadoc에서 다음을 참조하십시오.types투영 유형이 바인딩되는 유형을 의미합니다.
발췌문은 다음과 같이 사용할 수 있습니다.

@RepositoryRestResource(excerptProjection = InlineAddress.class)
interface PersonRepository extends CrudRepository<Person, Long> {}

이것을 취득하려면(MyRepositoryRestMvcConfiguration을 사용하는 경우에도):

{
  "firstName" : "Frodo",
  "lastName" : "Baggins",
  "address" : { 
    "street": "Bag End",
    "state": "The Shire",
    "country": "Middle Earth"
  }
}

에게는 ★★★★★★★★★★★★★★★★★.sector 상당하다address.

최종 노트

_links필드는 삭제되지 않습니다(너무 간섭적이어서 삭제할 수 없습니다).결국 다음과 같은 결과가 됩니다.

{
    "_embedded" : {
        "persons" : [ {person1}, {person2}, ..., {personN} ]
    },
    "_links" : {
        e.g. first, next, last, self, profile
    },
    "page" : {
      "size" : 1,
      "totalElements" : 10,
      "totalPages" : 10,
      "number" : 0
    }
}

처럼 ' '있다', '있다', '있다'가_links 원하게 될 것이다._embeddedreplaced replaced persons유지관리 가능한 코드가 적어집니다(스프링 침입 오버라이드가 너무 많음).도 꼭 .RepositoryRestMvcConfiguration ★★★★★★★★★★★★★★★★★」RepositoryEntityController.getCollectionResource

봄은 진화하고 있기 때문에, 적어도 다음과 같이 기능하고 있는 것을 지적할 필요가 있습니다.

spring-data-rest-webmvc 3.1.3.RELEASE

또는 스프링 부트버전을 선호하는 경우:

spring-boot-starter-parent 2.1.1.RELEASE

_links를 삭제하려면 다음 작업을 수행합니다(내 경우).

  1. pom.xml로 이동하여 다음 종속성을 삭제합니다.

    spring-boot-data-rest

  2. "Update project"를 작성하여 pom.xml 변경 내용을 업데이트합니다.

이제 api rest를 위해 자체 컨트롤러를 사용하여 다음과 같은 _self, _links...를 삭제합니다.

[... package declaration, imports ...]
@RestController
@RequestMapping("/series")
public class SerieController {
    @Autowired
    private SerieRepositorio serieRepositorio;
    
    public SerieController(SerieRepositorio serieRepositorio) {
        this.serieRepositorio = serieRepositorio;
    }

    @GetMapping
    public Iterable<Serie> getAllSeries() {
        return serieRepositorio.findAll();
    }
   }

언급URL : https://stackoverflow.com/questions/23264044/disable-hypertext-application-language-hal-in-json

반응형