Ошибка Whitepage, не могу найти мою проблему в REST API? - PullRequest
0 голосов
/ 01 апреля 2019

Я создаю API-интерфейс REST для доступа к базе данных и постоянно сталкиваюсь с ошибкой / постоянным получением ошибки. Бег по кругу, пытающийся найти мою ошибку и / или мою ошибку в потоке или логике программы.

Вот мое заявление:

package com.skilldistillery.myRest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan(basePackages= {"com.skilldistillery.edgemarketing"})
@EntityScan("com.skilldistillery.edgemarketing")
@EnableJpaRepositories("com.skilldistillery.myRest.repositories")
public class MyRestApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyRestApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(MyRestApplication.class, args);
    }

}

Мой контроллер:

package com.skilldistillery.myRest.controllers;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.skilldistillery.edgemarketing.entities.House;
import com.skilldistillery.myRest.services.HouseService;

@RestController
@RequestMapping("api") 
@CrossOrigin({ "*", "http://localhost:4200" })
public class HouseController {

    @Autowired 
    HouseService houseServ; 

    @GetMapping("index/{id}")
    public House show(@PathVariable("id") Integer id) {
        return houseServ.show(id); 
    }

}

Мой репо:

package com.skilldistillery.myRest.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.skilldistillery.edgemarketing.entities.House;

@Repository
public interface HouseRepo extends JpaRepository<House, Integer>  {


}

Мой сервис:

package com.skilldistillery.myRest.services;

import java.util.List;

import org.springframework.stereotype.Service;

import com.skilldistillery.edgemarketing.entities.House;

@Service
public interface HouseService {

    List<House> index(); 

    House show(Integer id); 
}

И мой ServiceImpl:

package com.skilldistillery.myRest.services;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.skilldistillery.edgemarketing.entities.House;
import com.skilldistillery.myRest.repositories.HouseRepo;

@Service
public class HouseServiceImpl {
    @Autowired
    HouseRepo hRepo; 

    public House show(Integer id) {
        Optional<House> opt = hRepo.findById(id); 
        House house = null;
        if (opt.isPresent()) {
            house = opt.get();
        }
        return house;
    }

}

Он компилируется и запускается, но через почтальон и браузер я получаю ошибки на белой странице. Я искал интернет, пытаясь понять, где я иду не так, но не нашел его. Пожалуйста, порекомендуйте.

1 Ответ

1 голос
/ 01 апреля 2019

Вы можете использовать следующее решение.Измените ваш основной класс на следующий код

@SpringBootApplication
public class MyrestapplicationApplication  {
    public static void main(String[] args) {
        SpringApplication.run(MyrestapplicationApplication.class, args);
    }

}

Затем создайте отдельный класс для ваших конфигураций. А также убегайте от тесно связанной архитектуры.

@Configuration
@EntityScan("com.skilldistillery.edgemarketing.entities")
@EnableJpaRepositories("com.skilldistillery.myRest.repositories")
public class BusinessConfig {

    @Bean
    public HouseService houseService(final HouseRepo houseRepo){
        return new HouseServiceImpl(houseRepo);
    }   
}

Затем ваш контроллер изменитсяк следующему. Использование инъекции зависимостей

@RestController
@RequestMapping("api") 
@CrossOrigin({ "*", "http://localhost:4200" })
public class HouseController {

   private   HouseService houseServ;

    public HouseController(HouseService houseServ) {
        this.houseServ = houseServ;
    }

    @GetMapping(value = "index/{id}",produces = MediaType.APPLICATION_JSON_VALUE,consumes = MediaType.APPLICATION_JSON_VALUE)
    public House show(@PathVariable("id") Integer id) {
        return houseServ.show(id); 
    }
}

HouseServiceImpl также должен реализовывать HouseService

public class HouseServiceImpl implements HouseService{
  private  HouseRepo hRepo;

    public HouseServiceImpl(HouseRepo hRepo) {
        this.hRepo = hRepo;
    }

    @Override
    public List<House> index() {
        return null;
    }

    public House show(Integer id) {
        Optional<House> opt = hRepo.findById(id); 
        House house = new House();
        if (opt.isPresent()) {
            house = opt.get();
        }
        return house;
    }

}

* NB - не забудьте удалить следующие конфиги @Autowired,@Repository так как они теперь обрабатываются в классе BusinessConfig. Другие Beans могут быть определены в BusinessConfig Class

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