Spring-проект успешно запускается, но результат не выводится на экран
Только знакомлюсь со Spring. Необходимо сделать данный туториал - https://spring.io/guides/tutorials/rest/. Написал половину кода, что там дано. И в середине туториала нам предлагают запустить проект и посмотреть, что уже получилось!
Получиться должно вот что:
Вместо этого у меня по адресу http://localhost:8080/ или http://localhost:8080/employees ничего не выводит(не получается получить доступ к сайту). Либо если через консольку, но итог тот же.
В Idea у меня проект успешно собирается и сам завершает свою работу без ошибок или предупреждений(build succesfull).
Все делал точно по туториалу, весь код изучал, а затем тупо copy + past(ошибок быть не может в коде).
Java jdk v.12; Intelij Idea последняя; Gradle свежий; ну и Spring соответственно актуальный.
Что выводит в Idea:
17:11:47: Executing task 'bootRun'...
Starting Gradle Daemon...
Gradle Daemon started in 7 s 756 ms
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootRun
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.5.RELEASE)
2020-03-05 17:13:30.295 INFO 8556 --- [ main] com.example.demo.PayrollApplication : Starting PayrollApplication on LAPTOP-5TNNRU08 with PID 8556 (started by ����� in C:\Users\�����\Downloads\demo\demo)
2020-03-05 17:13:30.307 INFO 8556 --- [ main] com.example.demo.PayrollApplication : No active profile set, falling back to default profiles: default
2020-03-05 17:13:33.892 INFO 8556 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2020-03-05 17:13:34.216 INFO 8556 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 258ms. Found 1 JPA repository interfaces.
2020-03-05 17:13:36.645 INFO 8556 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-03-05 17:13:38.084 INFO 8556 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-03-05 17:13:38.596 INFO 8556 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2020-03-05 17:13:39.158 INFO 8556 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.12.Final
2020-03-05 17:13:40.361 INFO 8556 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
2020-03-05 17:13:41.459 INFO 8556 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
2020-03-05 17:13:42.410 INFO 8556 --- [ main] org.hibernate.tuple.PojoInstantiator : HHH000182: No default (no-argument) constructor for class: com.example.demo.Employee (class must be instantiated by Interceptor)
2020-03-05 17:13:43.758 INFO 8556 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-03-05 17:13:43.786 INFO 8556 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2020-03-05 17:13:46.342 INFO 8556 --- [ main] com.example.demo.PayrollApplication : Started PayrollApplication in 18.615 seconds (JVM running for 22.629)
2020-03-05 17:13:46.629 INFO 8556 --- [ main] com.example.demo.LoadDatabase : Preloading Employee(id=1, name=Bilbo Baggins, role=burglar)
2020-03-05 17:13:46.631 INFO 8556 --- [ main] com.example.demo.LoadDatabase : Preloading Employee(id=2, name=Frodo Baggins, role=thief)
2020-03-05 17:13:46.641 INFO 8556 --- [extShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2020-03-05 17:13:46.642 INFO 8556 --- [extShutdownHook] .SchemaDropperImpl$DelayedDropActionImpl : HHH000477: Starting delayed evictData of schema as part of SessionFactory shut-down'
2020-03-05 17:13:46.673 INFO 8556 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2020-03-05 17:13:46.678 INFO 8556 --- [extShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
BUILD SUCCESSFUL in 1m 17s
3 actionable tasks: 1 executed, 2 up-to-date
17:13:47: Task execution finished 'bootRun'.
КОД:
package com.example.demo;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Data
@Entity
class Employee {
private @Id @GeneratedValue Long id;
private String name;
private String role;
// Employee() {}
Employee(String name, String role) {
this.name = name;
this.role = role;
}
}
package com.example.demo;
import java.util.List;
import org.springframework.web.bind.annotation.DeleteMapping;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
class EmployeeController {
private final EmployeeRepository repository;
EmployeeController(EmployeeRepository repository) {
this.repository = repository;
}
// Aggregate root
@GetMapping("/employees")
List<Employee> all() {
return repository.findAll();
}
@PostMapping("/employees")
Employee newEmployee(@RequestBody Employee newEmployee) {
return repository.save(newEmployee);
}
// Single item
@GetMapping("/employees/{id}")
Employee one(@PathVariable Long id) {
return repository.findById(id)
.orElseThrow(() -> new EmployeeNotFoundException(id));
}
@PutMapping("/employees/{id}")
Employee replaceEmployee(@RequestBody Employee newEmployee, @PathVariable Long id) {
return repository.findById(id)
.map(employee -> {
employee.setName(newEmployee.getName());
employee.setRole(newEmployee.getRole());
return repository.save(employee);
})
.orElseGet(() -> {
newEmployee.setId(id);
return repository.save(newEmployee);
});
}
@DeleteMapping("/employees/{id}")
void deleteEmployee(@PathVariable Long id) {
repository.deleteById(id);
}
}
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@ControllerAdvice
class EmployeeNotFoundAdvice {
@ResponseBody
@ExceptionHandler(EmployeeNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
String employeeNotFoundHandler(EmployeeNotFoundException ex) {
return ex.getMessage();
}
}
package com.example.demo;
public class EmployeeNotFoundException extends RuntimeException{
EmployeeNotFoundException(Long id) {
super("Could not find employee " + id);
}
}
package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;
public interface EmployeeRepository extends JpaRepository<Employee, Long>{
}
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@Slf4j
class LoadDatabase {
@Bean
CommandLineRunner initDatabase(EmployeeRepository repository) {
return args -> {
log.info("Preloading " + repository.save(new Employee("Bilbo Baggins", "burglar")));
log.info("Preloading " + repository.save(new Employee("Frodo Baggins", "thief")));
};
}
}
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class PayrollApplication {
public static void main(String... args) {
SpringApplication.run(PayrollApplication.class, args);
}
}
BULD.GRADLE:
plugins {
id 'org.springframework.boot' version '2.2.5.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
Ответы (1 шт):
Оказывается все очень просто! 3 дня мучений и ошибка найдена!
В классе Employee временно закомментировал пустой конструктор, и забыл про него.
package com.example.demo;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Data
@Entity
class Employee {
private @Id @GeneratedValue Long id;
private String name;
private String role;
Employee() {} // Закомментил его и забыл снять комменты
Employee(String name, String role) {
this.name = name;
this.role = role;
}
}
