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
-> HALapplication/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)에서 해결되었습니다.
관리 대상 자원 간의 관계를 표현하고 서버를 검출할 수 있도록 하기 위해서는 하이퍼미디어 포맷이 필요합니다.그래서 완전히 없앨 수 있는 방법은 없어요.이는 주로 쌍방향 관계를 가진 엔티티를 노출하거나 거대한 객체 그래프를 구성하는 경우 서버를 쉽게 크래시할 수 있기 때문입니다.
관련 엔티티 인라인화
, 은 단순히 입니다.SectorRepository
REST ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」을 붙이면 이 작업을 수행할 수 .@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
원하게 될 것이다._embedded
replaced replaced persons
유지관리 가능한 코드가 적어집니다(스프링 침입 오버라이드가 너무 많음).도 꼭 .RepositoryRestMvcConfiguration
★★★★★★★★★★★★★★★★★」RepositoryEntityController.getCollectionResource
봄은 진화하고 있기 때문에, 적어도 다음과 같이 기능하고 있는 것을 지적할 필요가 있습니다.
spring-data-rest-webmvc 3.1.3.RELEASE
또는 스프링 부트버전을 선호하는 경우:
spring-boot-starter-parent 2.1.1.RELEASE
_links를 삭제하려면 다음 작업을 수행합니다(내 경우).
pom.xml로 이동하여 다음 종속성을 삭제합니다.
spring-boot-data-rest
"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
'programing' 카테고리의 다른 글
tslint는 console.log에 대한 호출이 허용되지 않는다고 합니다.- 어떻게 하면 허용합니까? (0) | 2023.03.14 |
---|---|
리액트 훅을 사용하여 Next.js SSR에서 창 크기를 검출하는 방법 (0) | 2023.03.14 |
Jackson을 사용하여 json으로 바이트 배열 보내기 (0) | 2023.03.14 |
AngularJS : 디렉티브에서의 최소화 문제 (0) | 2023.03.14 |
PHP json_decode()에서 잘못된 json 데이터를 감지하시겠습니까? (0) | 2023.03.14 |