Home > OS >  Return key value of a JSON request in Spring
Return key value of a JSON request in Spring

Time:03-18

I'm trying to create a route to perform a GET Request to /winner to show the restaurants that had the count of 3 votes in the JSON, but every time I do the GET, it returns the value of null instead of the value I would like.

I was expecting something like that:

{
    "id": 1,
    "restaurant": "Burger King",
    "address": "Av. Ipiranga, 1600",
    "website": "https://www.burgerking.com.br/",
    "description": "Rede de fast-food famosa com hambúrgueres grelhados, batata frita e milk-shakes.",
    "count": 3
}

Instead that, I'm just getting an empty JSON with the null value. Here are the classes I'm using:

Restaurant.java

package com.dbserver.restaurantes.entities;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "db_restaurants")
public class Restaurant {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String restaurant;
    private String address;
    private String website;
    private String description;
    private Integer count;

    @OneToMany(mappedBy = "id.restaurant")
    private Set<Vote> votes = new HashSet<>();

    public Restaurant() {
    }

    public Restaurant(Long id, String restaurant, String address, String website, String description, Integer count) {
        this.id = id;
        this.restaurant = restaurant;
        this.address = address;
        this.website = website;
        this.description = description;
        this.count = count;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getRestaurant() {
        return restaurant;
    }

    public void setRestaurant(String restaurant) {
        this.restaurant = restaurant;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getWebsite() {
        return website;
    }

    public void setWebsite(String website) {
        this.website = website;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public Set<Vote> getVotes() {
        return votes;
    }

}

RestaurantDTO.java

package com.dbserver.restaurantes.dto;

import com.dbserver.restaurantes.entities.Restaurant;

public class RestaurantDTO {
    private Long id;
    private String restaurant;
    private String address;
    private String website;
    private String description;
    private Integer count;

    public RestaurantDTO() {
    }

    public RestaurantDTO(Long id, String restaurant, String address, String website, String description, Integer count) {
        this.id = id;
        this.restaurant = restaurant;
        this.address = address;
        this.website = website;
        this.description = description;
        this.count = count;
    }

    public RestaurantDTO(Restaurant restaurantDTO) {
        id = restaurantDTO.getId();
        restaurant = restaurantDTO.getRestaurant();
        address = restaurantDTO.getAddress();
        website = restaurantDTO.getWebsite();
        description = restaurantDTO.getDescription();
        count = restaurantDTO.getCount();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getRestaurant() {
        return restaurant;
    }

    public void setRestaurant(String restaurant) {
        this.restaurant = restaurant;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getWebsite() {
        return website;
    }

    public void setWebsite(String website) {
        this.website = website;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
    
    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }   
}

RestaurantServices.java

package com.dbserver.restaurantes.services;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dbserver.restaurantes.dto.RestaurantDTO;
import com.dbserver.restaurantes.dto.VoteDTO;
import com.dbserver.restaurantes.entities.Restaurant;
import com.dbserver.restaurantes.repositories.RestaurantRepository;

@Service
public class RestaurantServices {

    @Autowired
    private RestaurantRepository repository;

    @Transactional(readOnly = true)
    public Page<RestaurantDTO> findAll(Pageable pageable) {
        Page<Restaurant> result = repository.findAll(pageable);
        Page<RestaurantDTO> page = result.map(x -> new RestaurantDTO(x));
        return page;
    }
    
    @Transactional(readOnly = true)
    public RestaurantDTO findById(Long id) {
        Restaurant result = repository.findById(id).get();
        RestaurantDTO dto = new RestaurantDTO(result);
        return dto;
    }
    
    @Transactional(readOnly = true)
    public Restaurant findWinner(Integer count) {
        List<Restaurant> restaurants = new ArrayList<>();
        
        for (Restaurant restaurant: restaurants) {
            if(restaurant.getCount().equals(3)) {
                return restaurant;
            }
        }
        return null;
    }
    
    @Transactional
    public Restaurant addRestaurant(Restaurant newRestaurant) {
        return repository.saveAndFlush(newRestaurant);
    }
    
}

RestaurantController.java

package com.dbserver.restaurantes.controllers;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dbserver.restaurantes.dto.RestaurantDTO;
import com.dbserver.restaurantes.entities.Restaurant;
import com.dbserver.restaurantes.services.RestaurantServices;

@RestController
@RequestMapping(value = "/restaurants")
public class RestaurantController {

    @Autowired
    private RestaurantServices service;

    @GetMapping
    public Page<RestaurantDTO> findAll(Pageable pageable) {
        return service.findAll(pageable);
    }

    @GetMapping(value = "/{id}")
    public RestaurantDTO findById(@PathVariable Long id) {
        return service.findById(id);
    }
    
    @SuppressWarnings("unchecked")
    @GetMapping(value = "/winner")
    public List<RestaurantDTO> findWinner(Integer count) {
        return (List<RestaurantDTO>) service.findWinner(3);     
    };

    @PostMapping
    public Restaurant addRestaurant(@RequestBody Restaurant newRestaurant) {
        return service.addRestaurant(newRestaurant);
    }
    
}

CodePudding user response:

you didn't access dao in the method findWinner.
restaurants instance has just created without accessing dao.

@Transactional(readOnly = true)
    public Restaurant findWinner(Integer count) {
        List<Restaurant> restaurants = new ArrayList<>();
        
        for (Restaurant restaurant: restaurants) {
            if(restaurant.getCount().equals(3)) {
                return restaurant;
            }
        }
        return null;
    }

CodePudding user response:

because in the find winner method you have initialized restaurants with an empty array list. It should be like this.

@Transactional(readOnly = true)
public Restaurant findWinner(Integer count) {
    List<Restaurant> restaurants = repository.findAll();
    
    for (Restaurant restaurant: restaurants) {
        if(restaurant.getCount().equals(3)) {
            return restaurant;
        }
    }
    return null;
}
  • Related