尽管有FileNotFoundException,但是Java Spring Boot配置文件仍被正确处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尽管有FileNotFoundException,但是Java Spring Boot配置文件仍被正确处理相关的知识,希望对你有一定的参考价值。
owners.json
文件的[FileNotFoundException,尽管在mvn clean install
和/或mvn spring-boot:run
期间但在java -jar ./target/car-api-0.0.1-SNAPSHOT.jar
期间正在读取并填充数据库,]]
使用Java 1.8,Spring Boot,JPA,我创建了一个Spring Boot微服务,在微服务启动期间从文件中加载json数据:
@Component public class DataInserter implements ApplicationListener<ContextRefreshedEvent> { @Value("classpath:data/owners.json") Resource ownersResource; @Value("classpath:data/cars.json") Resource carsResource; @Autowired private OwnerService ownerService; @Autowired private CarsService carService; @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { List<Owner> populatedOwners = new ArrayList<>(); try { Owner aOwner; File ownersFile = ownersResource.getFile(); File carsFile = carsResource.getFile(); String ownersString = new String(Files.readAllBytes(ownersFile.toPath())); String carsString = new String(Files.readAllBytes(carsFile.toPath())); ObjectMapper mapper = new ObjectMapper(); List<Owner> owners = Arrays.asList(mapper.readValue(ownersString, Owner[].class)); List<Cars> cars = Arrays.asList(mapper.readValue(carsString, ElectricCars[].class)); // Populate owners one by one for (Owner owner : owners) { aOwner = new Owner(owner.getName()); ownerService.createOwner(aOwner); populatedOwners.add(aOwner); } // Populate owner cars one by one for (int i = 0; i < populatedOwners.size(); i++) { carService.createCars(populatedOwners.get(i).getId(), cars.get(i)); } } catch(IOException ioe) { ioe.printStackTrace();; } } }
src / main / resources / data / cars.json:
[ { "make": "Honda", "model": "Accord", "year": "2020" }, { "make": "Nissan", "model": "Maxima", "year": "2019" }, { "make": "Toyota", "model": "Prius", "year": "2015" }, { "make": "Porsche", "model": "911", "year": "2017" }, { "make": "Hyundai", "model": "Elantra", "year": "2018" }, { "make": "Volkswagen", "model": "Beatle", "year": "1973" }, { "make": "Ford", "model": "F-150", "year": "2010" }, { "make": "Chevrolet", "model": "Silverado", "year": "2020" }, { "make": "Toyota", "model": "Camary", "year": "2018" }, { "make": "Alfa", "model": "Romeo", "year": "2017" } ]
src / main / resources / data / owners.json:
[ { "name": "Tom Brady" }, { "name": "Kobe Bryant" }, { "name": "Mike Tyson" }, { "name": "Scottie Pippen" }, { "name": "John Madden" }, { "name": "Arnold Palmer" }, { "name": "Tiger Woods" }, { "name": "Magic Johnson" }, { "name": "George Foreman" }, { "name": "Charles Barkley" } ]
所以,当我运行这个:
mvn clean install
一切正常!
但是随后我要这样做:
java -jar ./target/car-api-0.0.1-SNAPSHOT.jar
我在IntelliJ IDEA的标准输出中看到了这一点:
java.io.FileNotFoundException: class path resource [data/owners.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/Owners/myowner/car-api/target/car-api-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/data/owners.json at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217) at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:154) at com.myapi.bootstrap.DataInserter.onApplicationEvent(DataInserter.java:50) at com.myapi.bootstrap.DataInserter.onApplicationEvent(DataInserter.java:24) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:403) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:360) at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:897) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.finishRefresh(ServletWebServerApplicationContext.java:162) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:553) at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) at com.nuvve.CarApplication.main(CarApplication.java:12) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) at org.springframework.boot.loader.Launcher.launch(Launcher.java:51) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:52)
现在,数据库仍然为空,我无法通过任何HTTP Get请求访问我的数据。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.myapi</groupId> <artifactId>car-api</artifactId> <version>0.0.1-SNAPSHOT</version> <name>car-api</name> <description>Car REST API</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
src / main / resources / applications.properties:
server.servlet.context-path=/car-api server.port=8080 server.error.whitelabel.enabled=false # Database specific spring.jpa.hibernate.ddl-auto=create spring.datasource.url=jdbc:mysql://localhost:3306/car_db?useSSL=false spring.datasource.ownername=root spring.datasource.password=
所有者实体:
@Entity @Table(name = "owner") public class Owner { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull private String name; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner") private List<Car> cars = new ArrayList<>(); public Owner() { } // Getter & Setters omitted for brevity. }
汽车实体:
@Entity @Table(name="car") public class Car { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; String make; String model; String year; @JsonIgnore @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "owner_id", nullable = false) private Owner owner; // Getter & Setters omitted for brevity. }
OwnerRepository:
@Repository public interface OwnerRepository extends JpaRepository<Owner, Long> { }
CarRepository:
@Repository public interface CarRepository extends JpaRepository<Car, Long> { }
OwnerService:
public interface OwnerService { boolean createOwner(Owner owner); Owner getOwnerByOwnerId(Long ownerId); List<Owner> getAllOwners(); }
OwnerServiceImpl:
@Service public class OwnerServiceImpl implements OwnerService { @Autowired OwnerRepository ownerRepository; @Autowired CarRepository carRepository; @Override public List<Owner> getAllOwners() { return ownerRepository.findAll(); } @Override public boolean createOwner(Owner owner) { boolean created = false; if (owner != null) { ownerRepository.save(owner); created = true; } return created; } @Override public Owner getOwnerByOwnerId(Long ownerId) { Optional<Owner> owner = null; if (ownerRepository.existsById(ownerId)) { owner = ownerRepository.findById(ownerId); } return owner.get(); } }
汽车服务:
public interface CarService { boolean createCar(Long ownerId, Car car); }
CarServiceImpl:
@Service public class CarServiceImpl implements CarService { @Autowired OwnerRepository ownerRepository; @Autowired CarRepository carRepository; @Override public boolean createCar(Long ownerId, Car car) { boolean created = false; if (ownerRepository.existsById(ownerId)) { Optional<Owner> owner = ownerRepository.findById(ownerId); if (owner != null) { List<Car> cars = owner.get().getCars(); cars.add(car); owner.get().setCars(cars); car.setOwner(owner.get()); carRepository.save(car); created = true; } } return created; } }
OwnerController:
@RestController public class OwnerController { private HttpHeaders headers = null; @Autowired OwnerService ownerService; public OwnerController() { headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); } @RequestMapping(value = { "/owners" }, method = RequestMethod.POST, produces = "APPLICATION/JSON") public ResponseEntity<Object> createOwner(@Valid @RequestBody Owner owner) { boolean isCreated = ownerService.createOwner(owner); if (isCreated) { return new ResponseEntity<Object>(headers, HttpStatus.OK); } else { return new ResponseEntity<Object>(HttpStatus.NOT_FOUND); } } @RequestMapping(value = { "/owners" }, method = RequestMethod.GET, produces = "APPLICATION/JSON") public ResponseEntity<Object> getAllOwners() { List<Owner> owners = ownerService.getAllOwners(); if (owners.isEmpty()) { return new ResponseEntity<Object>(HttpStatus.NOT_FOUND); } return new ResponseEntity<Object>(owners, headers, HttpStatus.OK); } @RequestMapping(value = { "/owners/{ownerId}" }, method = RequestMethod.GET, produces = "APPLICATION/JSON") public ResponseEntity<Object> getOwnerByOwnerId(@PathVariable Long ownerId) { if (null == ownerId || "".equals(ownerId)) { return new ResponseEntity<Object>(HttpStatus.NOT_FOUND); } Owner owner = ownerService.getOwnerByOwnerId(ownerId); return new ResponseEntity<Object>(owner, headers, HttpStatus.OK); } }
CarController:
@RestController public class CarController { private HttpHeaders headers = null; @Autowired CarService carService; public CarController() { headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); } @RequestMapping(value = { "/cars/{ownerId}" }, method = RequestMethod.POST, produces = "APPLICATION/JSON") public ResponseEntity<Object> createCarBasedOnOwnerId(@Valid @RequestBody Car car, Long ownerId) { boolean isCreated = carService.createCar(ownerId, car); if (isCreated) { return new ResponseEntity<Object>(headers, HttpStatus.OK); } else { return new ResponseEntity<Object>(HttpStatus.NOT_FOUND); } }
为什么发布
mvn clean install
和/或mvn spring-boot:run
却抛出此FileNotFoundException时为什么正确地填充数据库?
必须与java -jar ./target/car-api-0.0.1-SNAPSHOT.jar
一起使用,因为这是运行JUnit测试并在Linux / Unix(登台和生产服务器)上设置服务守护程序的唯一方法。
[FileNotFoundException for owner.json文件,尽管已在mvn全新安装和/或mvn spring-boot:run期间读取并填充数据库,但运行java -jar ./target/car-api-0.0.1-SNAPSHOT.jar。 ...
这没有用,因为嵌入在Spring Boot jar中的owner.json文件,并且该jar没有展开:
以上是关于尽管有FileNotFoundException,但是Java Spring Boot配置文件仍被正确处理的主要内容,如果未能解决你的问题,请参考以下文章
FileNotFoundException:“无法加载文件或程序集”尽管程序集存在 [关闭]
Java - 访问被拒绝 java.io.FileNotFoundException [重复]