Spring HATEOAS не учитывает свойство включения по умолчанию для ссылки на ресурс - PullRequest
0 голосов
/ 11 декабря 2018

У меня проблема, аналогичная той, которая была задана в в этом вопросе , однако применение предложенного решения

spring.jackson.default-property-inclusion=NON_NULL не останавливает HATEOAS от рендеринга ссылок с нулевыми свойствами.Вот мое объявление контроллера

@RestController
@ExposesResourceFor(Customer.class)
public class CustomerController {
  // controller methods here
}

и класс веб-конфигурации

@Configuration
@EnableSpringDataWebSupport
@EnableHypermediaSupport(type = EnableHypermediaSupport.HypermediaType.HAL)
public class DataApiWebConfiguration extends WebMvcConfigurationSupport {
  // config here
}

В методе Controller get, который возвращает ресурс, я объявляю отображение следующим образом

@GetMapping(value = "/customers/{id}", produces = MediaTypes.HAL_JSON_VALUE)

и затем я возвращаю Resource

Optinal<Customer> customer = customerRepository.findById(id);
return customer.map(customerResourceAssembler::toResource).map(ResponseEntity::ok)
                            .orElse(ResponseEntity.notFound().build());

CustomerResourceAssembler расширяет SimpleIdentifiableResourceAssembler, как показано в этом примере с весенним ненавистью .

Но в ответеbody Я до сих пор вижу ссылки, отображаемые с нулевыми свойствами

"links": [
            {
                "rel": "self",
                "href": "http://localhost:8080/customers/11",
                "hreflang": null,
                "media": null,
                "title": null,
                "type": null,
                "deprecation": null
            }
]

Это не похоже на то, каким должен быть ответ HATEOAS, как в примерах, которые я вижу _links not links в JSON

1 Ответ

0 голосов
/ 17 декабря 2018

Проблема была в моем классе конфигурации, я неправильно регистрировал Hibernate5Module, удалил эти строки

@Bean
    public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new HibernateAwareObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jsonConverter.setObjectMapper(objectMapper);
        return jsonConverter;
    }

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(customJackson2HttpMessageConverter());
    super.addDefaultHttpMessageConverters(converters);
}

и просто добавил бин

@Bean
public Module hibernate5Module() {
    return new Hibernate5Module();
}

, который исправилвывод

{
    "_embedded": {
        "customers": [
            {
                "name": "Minty And Sons Pvt. Ltd.",
                "pan": "5GB7W15M0T",
                "currecny": "INR",
                "tds": 0.1,
                "invoice_prefix": "INV",
                "_links": {
                    "self": {
                        "href": "/customers/1"
                    },
                    "customers": {
                        "href": "/customers"
                    },
                    "contact": {
                        "href": "/customers/1/contact"
                    },
                    "branches": {
                        "href": "/customers/1/branches"
                    },
                    "invoices": {
                        "href": "/customers/1/invoices"
                    },
                    "paid-invoices": {
                        "href": "/customers/1/invoices/paid"
                    },
                    "pending-invoices": {
                        "href": "/customers/1/invoices/pending"
                    },
                    "overdue-invoices": {
                        "href": "/customers/1/invoices/overdue"
                    }
                }
            }
        ]
    },
    "_links": {
        "self": {
            "href": "http://localhost:8080/data/api/customers"
        }
    },
    "page": {
        "size": 20,
        "total_elements": 1,
        "total_pages": 1,
        "number": 0
    }
}
...