Пользовательский запрос Spring Boot в контроллере - PullRequest
0 голосов
/ 21 июня 2020

Как мне добавить пользовательский запрос к моему загрузочному приложению Spring и получить к нему доступ в контроллере?

У меня есть две таблицы с именами CarBrand и YearMade. CarBrand содержит столбцы ID, code и Brand. YearMade также имеет ID, code и year в качестве столбцов.

Я написал свои классы моделей с методами установки и получения для каждой сущности. Я добавил свои интерфейсы репозитория и свои классы обслуживания.

public interface YearRepository extends JpaRepository<Year, Long> {
}

Мой репозиторий бренда

public interface BrandRepository extends JpaRepository<Brand, Long> {

    @Query("select b from brand b where brand.brand = ?1")
    List<Brand> findVehicleBrand(String brand);
}

Вот мой класс обслуживания

public class YearService {

    @Autowired
    private YearRepository yearRepository;

    public List<Year> listAll(){
        return yearRepository.findAll();
    }

    public void save(Year engineSize){
       yearRepository.save(engineSize);
    }

    public Year get (long id){
        return yearRepository.findById(id).get();
    }

    public void delete (Long id){
        yearRepository.deleteById(id);
    }
}

My Brand Service

public interface BService {

    List<Brand> findVehicleBrand(String name);

}

И это.

@Service
@Transactional
public class BrandService implements BService{

    @Autowired
    private BrandRepository brandRepository;

    public List<Brand> listAll(){
        return brandRepository.findAll();
    }

    public void save(Brand brand){
        brandRepository.save(brand);
    }

    public Brand get (long id){
        return brandRepository.findById(id).get();
    }

    public void delete (Long id){
        brandRepository.deleteById(id);
    }

    @Override
    public List<Brand> findVehicleBrand(String name) {
        var brand = (List<Brand>) brandRepository.findVehicleBrand(name);
        return brand;
    }
}

В моем контроллере я получаю переменную пути со строкой, я использую substring, чтобы разбить строку на две. Две подстроки содержат код марки и года. Первые два представляют год, а три других - бренд. Как сравнить коды с кодами в базе данных, чтобы получить фактический год и марку.

http://localhost: 8081 / vincode / wwQPT

ww - это код для 1990 года и QPT для Honda Motor Company в базе данных.

Мне нужен JSON ответ, подобный этому

{
    Year Made : 1990,
    Brand Name : Honda Motor Company
}

Вот класс контроллера, который у меня есть на данный момент.

@RequestMapping("/{vincode}")
public @ResponseBody String getAttr(@PathVariable(value="vincode") String vincode) {
    String yr = vincode.substring(0,1);
    String brand = vincode.substring(2,4);
    System.out.println(yr);
    return yr;
}

Где мне добавить запрос и как использовать его в моем контроллере?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 21 июня 2020

Если у вас нет запроса mappong со значением верхнего уровня класса, тогда http://localhost: 8081 / vincode / ww / QPT

RequestMapping ("/ vincode / {code} / {company}") может быть более полезно

Нет необходимости использовать подстроку, возможно, изменится код или размер ключа компании.

Также уровень обслуживания можно внедрить и использовать в любое время.

0 голосов
/ 21 июня 2020

Сначала добавьте этот оператор в интерфейс BrandRepository:

    public interface BrandRepository extends JpaRepository<Brand, Long> {
    @Query("select b from brand b where brand.brand = ?1")
    List<Brand> findVehicleBrand(String brand);
    public Brand findByCode(String code);
}

В интерфейсе YearRepository:

public interface YearRepository extends JpaRepository<Year, Long> {
public Year findByCode(String code);
}

Затем добавьте этот метод в класс BrandService:

public String findByCode (String code){
        return brandRepository.findByCode(code).getBrand();
    }

Затем добавьте этот метод в класс YearService:

public String findByCode (String code){
        return yearRepository.findByCode(code).getYear;
    }

Создать класс домена:

public class YearBrand
{
   private String YearMade;
   private String BrandName;
   public YearBrand(String year, String brand)
   {
    this.YearMade=year;
    this.BrandName=brand;
    }
}

Затем в классе контроллера:

@RequestMapping("/{vincode}")
    public YearBrand getAttr(@PathVariable(value="vincode") String vincode) {
        String yr = vincode.substring(0,1);
        String brand = vincode.substring(2,4);
        return new YearBrand(yearService.findByCode(yr),brandService.findByCode(brand));
    }

ПРИМЕЧАНИЯ: Убедитесь, что ваш контроллер Класс аннотируется @ RestController

0 голосов
/ 21 июня 2020

Spring Data JPA выводит запросы на основе соглашений об именах методов. Итак, чтобы получить year по code в таблице YearMade, вам нужно изменить свой YearReporsitory интерфейс следующим образом (добавить абстрактный метод):

 public interface YearRepository extends JpaRepository<Year, Long> {
          // set return type as required
          //find - Do What, ByCode - Criteria.
        public Integer findByCode(String code);
        }

И используйте этот метод в ваш YearService так же, как вы использовали другие методы. Но вы не можете использовать тот же метод для получения бренда по требованию кода. Вам нужно будет написать для него класс репо, например:

   public interface BrandRepository extends JpaRepository<CarBrand, Long> {
            public Integer findByCode(String code);
   }

Вы можете написать эти методы для всех членов вашего класса Entity. Вы должны следовать соглашению об именах, чтобы Spring распознал его.

EDIT (чтобы показать, как использовать это в контроллере и классе обслуживания):
YearRepository interface:

public interface YearRepository extends JpaRepository<Year, Long> {
              // set return type as required
              //find - Do What, ByCode - Criteria.
            public Integer findByCode(String code);
            }

BrandRepository

public interface BrandRepository extends JpaRepository<Brand, Long> {
 /*The below two methods are abstract methods.*/
   // it must follow the findby<MemberName> convention
   //return CarBrand
    CarBrand findByBrand(String brand);
    
    /*return a CarBrand Entity*/
    public CarBrand findByCode(String code);
    

YearService:

      public class YearService {

    @Autowired
    private YearRepository yearRepository;

    public List<Year> listAll() {
        return yearRepository.findAll();
    }

    public void save(Year engineSize) {
        yearRepository.save(engineSize);
    }

    public Year get(long id) {
        return yearRepository.findById(id).get();
    }

    public void delete(Long id) {
        yearRepository.deleteById(id);
    }

    public int getYearByCode(String code) {
     //here, we're using this method just as you've used the methods above.
    //Spring constructs the query at runtime
          return yearRepository.findByCode(code); //<-- usage of the custom method
    }

}

BService:

public interface BService {

    CarBrand findVehicleBrand(String name);

}

BrandService:

@Service
@Transactional
public class BrandService implements BService{

    @Autowired
    private BrandRepository brandRepository;

    public List<Brand> listAll(){
        return brandRepository.findAll();
    }

    public void save(Brand brand){
        brandRepository.save(brand);
    }

    public Brand get (long id){
        return brandRepository.findById(id).get();
    }

    public void delete (Long id){
        brandRepository.deleteById(id);
    }

    @Override
    public CarBrand findVehicleBrand(String name) {
        //var brand = (List<Brand>) brandRepository.findVehicleBrand(name);  
         var brand = brandRepository.findByBrand(name); //<-- using the custom method in brandRepository
        return brand;
    }
}

Ваш RepsonseDto:

  class RepsonseDto {
   
    private String yearMade;
    private brandName;
    
    //getters and setters
    /*Use  @JsonProperty("Year Made") and  @JsonProperty("Brand Name") on your getters. Otherwise, you will get json reposnse as: "yearMade" and "brandName"*/
    }

Контроллер:

Есть более эффективные способы написания контроллеров и внедрения зависимостей. Давайте сохраним пока это просто.

  @RequestController
    class YourController {
    
    //inject dependencies
    
    @Autowired
    YearService yearService;
    
    @Autowired
    BrandService brandService;
    
    @RequestMapping("/{vincode}")
    // the definition for ResponseEntity is above
    public ResponseEntity<RepsonseDto> getAttr(@PathVariable(value="vincode") String vincode) {
       // create a ReponseEntity object
       RepsonseDto retEntity = new RepsonseDto();
       
     
       // do a check for null and expected length of vincode
        if(vincode != null && vincode.length() == 5) {
        String yr = vincode.substring(0,1);
        String brand = vincode.substring(2,4);

        retEntity.setYearMade(yearService.getYearByCode(yr));
        retEntity.setBrandName(brandService.findVehicleBrand(brand));
  
        System.out.println(yr);
     
    }

 return new ResponseEntity<>(retEntity, HttpStatus.OK)
    
    }

ПРИМЕЧАНИЕ : Я не использовал IDE, чтобы написать это. Могут быть ошибки компилятора. Надеюсь, это даст вам представление обо всем этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...