2016-11-23 3 views
0

Я пишу услуги по отдыху для обучения весной. Я хочу вернуть динамические ответы (Json с несколькими свойствами) из контроллера. Например, у меня есть метод, когда я возвращаю список продуктов и Spring по умолчанию, используя конвертер сообщений, чтобы преобразовать его в Json. Он работает нормально.Как вернуть Json с несколькими свойствами с помощью ResponseEntity в Spring RestController

@RequestMapping(value = { "" }, method = RequestMethod.GET) 
public ResponseEntity<?> greet(@PathVariable Optional<Integer> productId) { 

    List<Products> products = productService.findAllCategories(); 
    int count = products.size(); // also want to include this as count like below response 
    return new ResponseEntity<List<Products>>(products, HttpStatus.OK); 
} 

Теперь я хочу ответ JSon как этот один

{ 
    "count": 23, 
    "products":[ 
    {..}, 
    {..} 
    ] 
} 

графа показать список count.How я возвращаю ответ, как это. Или направьте меня на лучшие практики для сценария, такие как возвращение Json с несколькими свойствами.

+0

создать обертку его и установить как счета и продукты собственности в другой боб и заменить список с новым боба ProductsDto, как как сделано @ сатья-д ниже. – TechnoCrat

+0

@TechnoCrat Предположим, у меня есть еще одна модель Клиентов, и я хочу то же самое, тогда мне придется сделать еще одну оболочку и так далее для других моделей. Мне нужно общее решение, чтобы во время выполнения я мог вернуть Json в любом формате. –

+0

в этом случае вам нужно будет добавить новое свойство в класс ProductsDTO со списком как показано ниже класс ПродуктыDTO { private int count; частный Список продукты; частный Список клиентов; } – TechnoCrat

ответ

0

I сделали это, но я не знаю, что это хорошая практика или нет.

@RequestMapping(value = { "/{productId}", "" }, method = RequestMethod.GET) 
public ResponseEntity<?> greet(@PathVariable Optional<Integer> productId) { 
    List<Products> products = productService.findAllCategories(); 

    HashMap<String, Object> hmap = new HashMap<String, Object>(); 
    hmap.put("count", products.size()); 
    hmap.put("products", products); 
    // Now I can put as many properties as I want 

    return new ResponseEntity<HashMap<String, Object>>(hmap, HttpStatus.OK); 
} 
+0

Он работает, если вы добавите Джексона в свой проект. Я бы предложил вам передать это: https://github.com/FasterXML/jackson и некоторые дополнительные ссылки. Я обновил свой ответ с помощью примера кода с помощью jackson –

3

Немного больше улучшения может достичь того, что вы ищете.

Создайте обертку для продуктов. Что-то вроде

class ProductsDTO { 

    private int count; 
    private List<Products> products; 

    /* create setters and getters for the fields */ 

} 

, а затем в вашем REST вызова

@RequestMapping(value = { "" }, method = RequestMethod.GET) 
public ResponseEntity<?> greet(@PathVariable Optional<Integer> productId) { 

List<Products> products = productService.findAllCategories(); 
int count = products.size(); 
ProductsDTO productsDTO = new ProductsDTO(); 
productsDTO.setCount(count); 
productsDTO.setProducts(products); 
return new ResponseEntity<ProductsDTO>(productsDTO, HttpStatus.OK); 
} 

EDIT:

@Shams Tabraiz Alam - Не уверен, что если вид результата, который вы хотите, чтобы сформировать это правильный путь, потому что, когда вы говорите «подсчет» и «список», совершенно верно, что вы возвращаетесь, и список сущности (продукта), и его счет результат [количество наименований продукции]. Не совсем точно цель добавления дополнительных данных, поскольку она удаляет фактическое значение возвращаемого списка, и это считается результатом. Во всяком случае, это моя точка зрения.

Для вашей ситуации, если вы не хотите использовать DTO и использовать карту, чтобы добавить как многие свойства, как вы хотите, я сделал пример кода (Maven путь)

Добавить Spring и другие существующие зависимостей, а затем добавить Джексона зависимостей в pom.xml

<dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.8.5</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.8.5</version> 
    </dependency> 

и есть контроллер REST,

@RequestMapping(value = "/locations", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<?> getAll() { 
    List<Location> locations = locationService.getLocations(); 
    List<Country> countries = countryService.getCountries(); 

    Map<String, Object> result = new HashMap<String,Object>(); 
    result.put("count",locations.size()); 
    result.put("locations",locations); 
    result.put("countries",countries); 
    // Add any additional props that you want to add 
    return new ResponseEntity<Map<String,Object>>(result, HttpStatus.OK); 
} 

Создание и развертывание сотрудничества de на вашем локальном веб-сервере (порт 8080) ИЛИ запустить через командную строку с помощью maven - mvn tomcat7: запустить

Проверьте это.

  1. Командная строка -

    curl -H "Accept: application/json" -H "Content-type: application/json" -X GET http://localhost:8080/api/locations 
    
  2. Browser

http://localhost:8080/api/locations

Полный код здесь - https://github.com/satya-j/loco

+0

Предположим, у меня есть еще одна модель Клиентов, и я хочу то же самое, тогда я должен сделать еще один класс с CustomerDTO и так далее для других моделей. Мне нужно общее решение. –

+0

@ShamsTabraizAlam Вы задаетесь вопросом в своем ответе {count: 23, ** products **: []}. Я ответил в этом аспекте. Если вы хотите использовать общее решение для вышеуказанного, как вы хотите вернуть ** результат (счет, список объектов) **, вам нужно смоделировать его в своем коде. –

+0

Если вам требуется общее решение, сделайте интерфейс X. Пусть все классы, которые вы хотите отправить в ответ, расширяют этот X. Измените свой класс ответа со свойствами: count и List . Таким образом, вы можете получить счетчик назначений и любой тип X для вашего класса ответа. – Valath

0
@RestController 
@RequestMapping("/api") 
public class RestApiController { 
    @Autowired 
    RepoCity repoCity; 

    @Autowired 
    RepoCountry repoCountry; 

    @Autowired 
    RepoLanguage repoLanguage; 

    @GetMapping("/allTotal") 
    public Map actionAllTotal() { 
     Map map = new HashMap(); 
     map.put("repoCity",repoCity.count()); 
     map.put("repoCountry",repoCountry.count()); 
     map.put("repoLanguage",repoLanguage.count()); 
     Map result = new HashMap();; 
     result.put("result",map); 
     return result; 
    } 

    @GetMapping("/country-detail/{id}") 
    public Map actionCountryDetail(@PathVariable("id") String id) { 
     Map result = new HashMap(); 
     result.put("result",repoCountry.findOne(id)); 
     return result; 
    } 
} 

Выход

enter image description here

+0

Рендеринг нескольких значений ключа Enity json –