Hello fellow programmers, I'm having trouble solving the 404 error in postman when I request the POST method.
{
"timestamp": "2022-06-01T03:17:33.459+00:00",
"status": 404,
"error": "Not Found",
"path": "/parking-spot"
}
I'm creating an API that does the parking control with Spring Boot. The program does not show any errors when I run the application.
2022-06-01 00:37:35.226 INFO 1720 --- [ main] c.a.p.ParkingControlApplication : Starting ParkingControlApplication using Java 17.0.2 on DESKTOP-7GPB86C with PID 1720 (C:\Users\sergio\Documents\Projetos\Spring boot\Projeto 01\parking-control\Parking Control\target\classes started by sergio in C:\Users\sergio\Documents\Projetos\Spring boot\Projeto 01\parking-control\Parking Control)
2022-06-01 00:37:35.228 INFO 1720 --- [ main] c.a.p.ParkingControlApplication : No active profile set, falling back to 1 default profile: "default"
2022-06-01 00:37:35.558 INFO 1720 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2022-06-01 00:37:35.568 INFO 1720 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 JPA repository interfaces.
2022-06-01 00:37:36.078 INFO 1720 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-06-01 00:37:36.091 INFO 1720 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-06-01 00:37:36.092 INFO 1720 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.63]
2022-06-01 00:37:36.177 INFO 1720 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-06-01 00:37:36.177 INFO 1720 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 908 ms
2022-06-01 00:37:36.275 INFO 1720 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2022-06-01 00:37:36.307 INFO 1720 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.6.9.Final
2022-06-01 00:37:36.421 INFO 1720 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2022-06-01 00:37:36.493 INFO 1720 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-06-01 00:37:36.634 INFO 1720 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2022-06-01 00:37:36.654 INFO 1720 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL10Dialect
2022-06-01 00:37:36.821 INFO 1720 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2022-06-01 00:37:36.829 INFO 1720 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2022-06-01 00:37:36.864 WARN 1720 --- [ main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2022-06-01 00:37:37.106 INFO 1720 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-06-01 00:37:37.113 INFO 1720 --- [ main] c.a.p.ParkingControlApplication : Started ParkingControlApplication in 2.176 seconds (JVM running for 2.494)
2022-06-01 00:38:30.217 INFO 1720 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-06-01 00:38:30.217 INFO 1720 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2022-06-01 00:38:30.218 INFO 1720 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
Aplication:
package com.api.parkingcontrol;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
#SpringBootApplication
#RestController
#ComponentScan("ParkingSpotController")
#EnableJpaRepositories("ParkingSpotRepository")
#EntityScan("ParkingSpotRepository")
public class ParkingControlApplication {
public static void main(String[] args) {
SpringApplication.run(ParkingControlApplication.class, args);
}
#GetMapping("/")
public String index() {
return "Olá Mundo";
}
}
Controller:
package com.api.parkingcontrol.controllers;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.api.parkingcontrol.dtos.ParkingSpotDto;
import com.api.parkingcontrol.models.ParkingSpotModel;
import com.api.parkingcontrol.services.ParkingSpotService;
#RestController
#CrossOrigin(origins = "*", maxAge = 3600)
#RequestMapping(value = "/parking-spot")
public class ParkingSpotController {
final ParkingSpotService parkingSpotService;
public ParkingSpotController(ParkingSpotService parkingSpotService) {
this.parkingSpotService = parkingSpotService;
}
#PostMapping("/parking-spot")
#ResponseBody
public ResponseEntity<Object> saveParkingSpot(#RequestBody #Valid ParkingSpotDto parkingSpotDto) {
if (parkingSpotService.existByLicensePlateCar(parkingSpotDto.getLicensePlateCar())) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Conflict: License Plate Car is already in use!");
}
if (parkingSpotService.existsByParkingSpotNumber(parkingSpotDto.getParkingSpotNumber())) {
return ResponseEntity.status(HttpStatus.CONFLICT).body("Conflict: Parking Spot already in use!");
}
if (parkingSpotService.existsByApartmentAndBlock(parkingSpotDto.getApartament(), parkingSpotDto.getBlock())) {
return ResponseEntity.status(HttpStatus.CONFLICT)
.body("Conflict: Parking Spot already registered for this apartment/block!");
}
var parkingSpotModel = new ParkingSpotModel();
BeanUtils.copyProperties(parkingSpotDto, parkingSpotModel);
parkingSpotModel.setRegistrationDate(LocalDateTime.now(ZoneId.of("UTC")));
return ResponseEntity.status(HttpStatus.CREATED).body(parkingSpotService.save(parkingSpotModel));
}
#GetMapping
public ResponseEntity<List<ParkingSpotModel>> getAllParkingSpots() {
return ResponseEntity.status(HttpStatus.OK).body(parkingSpotService.findAll());
}
}
Service:
package com.api.parkingcontrol.services;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.api.parkingcontrol.models.ParkingSpotModel;
import com.api.parkingcontrol.repositories.ParkingSpotRepository;
#Service
public class ParkingSpotService {
final ParkingSpotRepository parkingSpotRepository;
/*Constructor do Repository*/
public ParkingSpotService(ParkingSpotRepository parkingSpotRepository) {
this.parkingSpotRepository = parkingSpotRepository;
}
#Transactional
public Object save(ParkingSpotModel parkingSpotModel) {
return parkingSpotRepository.save(parkingSpotModel);
}
public boolean existByLicensePlateCar(String licensePlateCar) {
return parkingSpotRepository.existByLicensePlateCar(licensePlateCar);
}
public boolean existsByParkingSpotNumber(String parkingSpotNumber) {
return parkingSpotRepository.existsByParkingSpotNumber(parkingSpotNumber);
}
public boolean existsByApartmentAndBlock(String apartament, String block) {
return parkingSpotRepository.existsByApartmentAndBlock(apartament, block);
}
public List<ParkingSpotModel> findAll (){
return parkingSpotRepository.findAll();
}
}
Am I missing something?
The problem is that in your controller you have
1)
#RequestMapping(value = "/parking-spot")
public class ParkingSpotController
and
2)
#PostMapping("/parking-spot")
#ResponseBody
public ResponseEntity<Object> saveParkingSpot
This means that your endpoint will be available by the path: /parking-spot/parking-spot
Related
I'm still getting an error even though there is no error in my IDE
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
#SpringBootApplication
#RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
#GetMapping
public List<String> hello(){
return List.of("hello", "world");
}
}
:: Spring Boot :: (v3.0.0-SNAPSHOT)
2022-08-26T08:32:07.263+08:00 INFO 10580 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication using Java 17.0.4.1 on DESKTOP-53LAED9 with PID 10580 (C:\Users\Larty\Desktop\Programming Softwares\Springsss\demo\demo\target\classes started by Larty in C:\Users\Larty\Desktop\Programming Softwares\Springsss\demo\demo)
2022-08-26T08:32:07.276+08:00 INFO 10580 --- [ main] com.example.demo.DemoApplication : No active profile set, falling back to 1 default profile: "default"
2022-08-26T08:32:10.093+08:00 INFO 10580 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8060 (http)
2022-08-26T08:32:10.120+08:00 INFO 10580 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-08-26T08:32:10.121+08:00 INFO 10580 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.0.22]
2022-08-26T08:32:10.428+08:00 INFO 10580 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-08-26T08:32:10.434+08:00 INFO 10580 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3010 ms
2022-08-26T08:32:11.412+08:00 INFO 10580 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8060 (http) with context path ''
2022-08-26T08:32:11.435+08:00 INFO 10580 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 5.245 seconds (process running for 6.304)
More info that caused the error:
I change my port to 8060 cause I'm getting an error from 8080.
Try specify a path:
#GetMapping("/")
// or this syntax
#GetMapping(path = "/")
If you want to have more control over request mapping, you can take a look at #RequestMapping annotation.
BTW, the port is running at 8060, accessing http://localhost:8060 should return the list of Strings.
how to create a nested arrays in list in application properties, and insert it as a value?
#Value("${LIST_OF_NESTED_ARRAYS}")
List<String[]> list;
Yes, By using Spring Expression Language it can be achieved.
Code:
package com.test.listofarray;
import java.util.Arrays;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import lombok.extern.slf4j.Slf4j;
#SpringBootApplication
#Slf4j
public class TestApplication implements CommandLineRunner {
#Value("#{'${LIST_OF_NESTED_ARRAYS}'.split(';')}")
private List<String[]> list;
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
#Override
public void run(String... args) throws Exception {
list.forEach(array -> log.info("array ----> {}", Arrays.toString(array)));
}
}
application.properties
LIST_OF_NESTED_ARRAYS=India,USA,Brazil;Asia,Africa
use semi-column(;) to separate the values of each array in the above property and give the same semi-column(;) in the split function inside #value annotation.
Verify the output of the injected list in the below output log.
Output:
2021-11-01 17:48:39.105 INFO 11352 --- [ main] com.resilience.retry.RetryApplication : No active profile set, falling back to default profiles: default
2021-11-01 17:48:42.184 INFO 11352 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-11-01 17:48:42.206 INFO 11352 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-11-01 17:48:42.207 INFO 11352 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.54]
2021-11-01 17:48:42.411 INFO 11352 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-11-01 17:48:42.411 INFO 11352 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 3235 ms
2021-11-01 17:48:45.139 INFO 11352 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 1 endpoint(s) beneath base path '/actuator'
2021-11-01 17:48:45.256 INFO 11352 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-11-01 17:48:45.285 INFO 11352 --- [ main] com.resilience.retry.RetryApplication : Started RetryApplication in 6.946 seconds (JVM running for 7.648)
2021-11-01 17:48:45.397 INFO 11352 --- [ main] com.resilience.retry.RetryApplication : array ----> [India, USA, Brazil]
2021-11-01 17:48:45.400 INFO 11352 --- [ main] com.resilience.retry.RetryApplication : array ----> [Asia, Africa]
2021-11-01 17:49:03.860 INFO 11352 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-11-01 17:49:03.861 INFO 11352 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-11-01 17:49:03.862 INFO 11352 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
If you are using application.yml you can do it as follows:
yourProperty:
- - "Array1 - String1"
- "Array1 - String2"
- - "Array2 - String1"
- "Array2 - String2"
I'm a newbie in Spring. I try to create a project with SOLID techniques but was faced with that error. Inheritance does not work in my application. Why inheritance does not work properly? Is inheritance allowed in Spring?
Text of Error:
2021-06-23 23:54:08.928 INFO 12984 --- [ restartedMain] hrms.northwind.NorthwindApplication : Starting NorthwindApplication using Java 15.0.2 on DESKTOP-87K40S0 with PID 12984 (C:\Users\90553\Desktop\Eclipse Projects\HRMS Project\target\classes started by 90553 in C:\Users\90553\Desktop\Eclipse Projects\HRMS Project)
2021-06-23 23:54:08.929 INFO 12984 --- [ restartedMain] hrms.northwind.NorthwindApplication : No active profile set, falling back to default profiles: default
2021-06-23 23:54:08.978 INFO 12984 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2021-06-23 23:54:08.978 INFO 12984 --- [ restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2021-06-23 23:54:09.465 INFO 12984 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-06-23 23:54:09.512 INFO 12984 --- [ restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 40 ms. Found 2 JPA repository interfaces.
2021-06-23 23:54:10.040 INFO 12984 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-06-23 23:54:10.052 INFO 12984 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-06-23 23:54:10.052 INFO 12984 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.46]
2021-06-23 23:54:10.130 INFO 12984 --- [ restartedMain] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-06-23 23:54:10.130 INFO 12984 --- [ restartedMain] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1152 ms
2021-06-23 23:54:10.203 INFO 12984 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2021-06-23 23:54:10.367 INFO 12984 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2021-06-23 23:54:10.458 INFO 12984 --- [ restartedMain] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-06-23 23:54:10.502 INFO 12984 --- [ restartedMain] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.32.Final
2021-06-23 23:54:10.619 INFO 12984 --- [ restartedMain] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2021-06-23 23:54:10.721 INFO 12984 --- [ restartedMain] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
2021-06-23 23:54:11.047 WARN 12984 --- [ restartedMain] org.hibernate.cfg.AnnotationBinder : HHH000139: Illegal use of #Table in a subclass of a SINGLE_TABLE hierarchy: hrms.northwind.entities.concretes.Employer
2021-06-23 23:54:11.049 WARN 12984 --- [ restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ClassCastException: class org.hibernate.mapping.SingleTableSubclass cannot be cast to class org.hibernate.mapping.RootClass (org.hibernate.mapping.SingleTableSubclass and org.hibernate.mapping.RootClass are in unnamed module of loader 'app')
2021-06-23 23:54:11.050 INFO 12984 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2021-06-23 23:54:11.053 INFO 12984 --- [ restartedMain] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
2021-06-23 23:54:11.057 INFO 12984 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2021-06-23 23:54:11.066 INFO 12984 --- [ restartedMain] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-06-23 23:54:11.084 ERROR 12984 --- [ restartedMain] o.s.boot.SpringApplication : Application run failed
Employer Class:
package hrms.northwind.entities.concretes;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
#Entity(name="Employers")
#Table(name="Employers")
#Data
public class Employer extends Person {
#Id
#GeneratedValue
#Column(name="employer_id")
private int employerId;
#Column(name="company_name")
private String company_name;
#Column(name="website")
private String website;
#Column(name="phone_number")
private String phone_number;
#Column(name="password")
private String password;
public Employer(int personId, String name, String surname, String email, int employerId, String company_name, String website,
String phone_number, String password) {
super(personId, name, surname, email);
this.employerId = employerId;
this.company_name = company_name;
this.website = website;
this.phone_number = phone_number;
this.password = password;
}
}
Employer Dao:
package hrms.northwind.dataAccess.abstracts;
import org.springframework.data.jpa.repository.JpaRepository;
import hrms.northwind.entities.concretes.Employer;
public interface EmployerDao extends JpaRepository<Employer,Integer>{
}
Employer Service:
package hrms.northwind.business.abstracts;
import java.util.List;
import org.springframework.stereotype.Service;
import hrms.northwind.entities.concretes.Employer;
#Service
public interface EmployerService {
List<Employer> getAll();
}
Employer Controller:
package hrms.northwind.api.controllers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import hrms.northwind.business.abstracts.EmployerService;
import hrms.northwind.entities.concretes.Employer;
#RestController
#RequestMapping("/api/employers")
public class EmployerController {
private EmployerService employerService;
#Autowired
public EmployerController(EmployerService employerService) {
super();
this.employerService = employerService;
}
#GetMapping("/getall")
public List<Employer> getAll(){
return this.employerService.getAll();
}
}
Employer Table:
Employer Table
Any help?
Maybe is late for this answer
I think the problem comes from #Table. That annotation is optional when you want to specify an entity.
You could find better documented answer here
You can add this to your Employer class.
#Inheritance(strategy = InheritanceType.JOINED)
#JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
#PrimaryKeyJoinColumn(name="employer_id",referencedColumnName = "person_id")
I am new in Spring boot.I trying to access the controller url but i didn't get any response from them.
We are followed spring boot project structure as per document.
I have used componentscan annotation and added scanBasePackageClasses in SpringBootApplication annotation.But still same.
HomeController :-
package com.main.controllers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
#Controller
public class HomeController {
#RequestMapping(value="/home",method=RequestMethod.GET)
public String home() {
System.out.println("home");
return "home";
}
}
GAppsApplication.java:-
package com.main;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import com.main.controllers.HomeController;
#ComponentScan({"com.main.controllers"})
#SpringBootApplication(scanBasePackageClasses={HomeController.class})
public class GAppsApplication {
public static void main(String[] args) {
SpringApplication.run(GAppsApplication.class, args);
}
}
For your reference i shared below logs
logs:-
2018-08-28 08:26:16.404 INFO 8172 --- [ restartedMain] o.s.s.web.DefaultSecurityFilterChain : Creating filter chain: org.springframework.security.web.util.matcher.AnyRequestMatcher#1, [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter#58b9d6, org.springframework.security.web.context.SecurityContextPersistenceFilter#525747, org.springframework.security.web.header.HeaderWriterFilter#1638752, org.springframework.security.web.csrf.CsrfFilter#324c61, org.springframework.security.web.authentication.logout.LogoutFilter#14a6743, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#12d6ce4, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter#1837d01, org.springframework.security.web.authentication.www.BasicAuthenticationFilter#eda2d2, org.springframework.security.web.savedrequest.RequestCacheAwareFilter#4a5109, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter#4bb38c, org.springframework.security.web.authentication.AnonymousAuthenticationFilter#12205be, org.springframework.security.web.session.SessionManagementFilter#2e4343, org.springframework.security.web.access.ExceptionTranslationFilter#1a81a58, org.springframework.security.web.access.intercept.FilterSecurityInterceptor#12e7437]
2018-08-28 08:26:16.558 INFO 8172 --- [ restartedMain] o.s.b.d.a.OptionalLiveReloadServer : LiveReload server is running on port 35729
2018-08-28 08:26:16.592 INFO 8172 --- [ restartedMain] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-08-28 08:26:16.594 INFO 8172 --- [ restartedMain] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure
2018-08-28 08:26:16.600 INFO 8172 --- [ restartedMain] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2018-08-28 08:26:16.638 INFO 8172 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2018-08-28 08:26:16.642 INFO 8172 --- [ restartedMain] c.main.GAppsApplication : Started GAppsApplication in 5.153 seconds (JVM running for 5.734)
2018-08-28 08:27:11.961 INFO 8172 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet'
2018-08-28 08:27:11.961 INFO 8172 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started
2018-08-28 08:27:11.980 INFO 8172 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 19 ms
Change your controller to like below :
#RestController
#RequestMapping("/home")
public class HomeController {
#GetMapping
public String home() {
System.out.println("home");
return "home";
}
}
As your base package is com.main, so any package within com.main will automatically be scanned.
You don't need to put any special annotation to scan.
In the official Spring tutorial code source coode there are no controller required, so I didn't put them in my sample, however when I try to run my simple app I keep getting for http://localhost:8080/ or for http://localhost:8080/invoice the error:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing
this as a fallback. Thu Mar 09 10:18:51 CET 2017 There was an
unexpected error (type=Not Found, status=404). No message available
Structure:
$ tree
.
├── domain
│ ├── Invoice.java
│ └── InvoiceRepository.java
├── QbsApplication.java
invoice.java:
package qbs.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
#Entity
#Getter
#Setter
#ToString
public class Invoice {
#Id
#GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String issuedBy;
protected Invoice() {
}
public Invoice(String issuedBy) {
this.issuedBy = issuedBy;
}
}
REPO:
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface InvoiceRepository extends PagingAndSortingRepository<Invoice, Long> {
List<Invoice> findByIssuedBy(#Param("issuer")String issuer);
}
and APP:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
#SpringBootApplication
public class QbsApplication {
public static void main(String[] args) {
SpringApplication.run(QbsApplication.class, args);
}
}
1. What seems to be the problem?
2. Can this be the lombok causing the issue (user the start.spring.io initializer though)?
EDIT
Spring BOot log:
2017-03-09 11:12:43.233 INFO 16837 --- [ main] org.hibernate.Version : HHH000412: Hibernate Core {5.0.12.Final}
2017-03-09 11:12:43.235 INFO 16837 --- [ main] org.hibernate.cfg.Environment : HHH000206: hibernate.properties not found
2017-03-09 11:12:43.236 INFO 16837 --- [ main] org.hibernate.cfg.Environment : HHH000021: Bytecode provider name : javassist
2017-03-09 11:12:43.274 INFO 16837 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2017-03-09 11:12:43.370 INFO 16837 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
2017-03-09 11:12:43.479 INFO 16837 --- [ main] o.h.e.j.e.i.LobCreatorBuilderImpl : HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
2017-03-09 11:12:43.481 INFO 16837 --- [ main] org.hibernate.type.BasicTypeRegistry : HHH000270: Type registration [java.util.UUID] overrides previous : org.hibernate.type.UUIDBinaryType#38ed139b
2017-03-09 11:12:43.695 WARN 16837 --- [ main] org.hibernate.orm.deprecation : HHH90000014: Found use of deprecated [org.hibernate.id.SequenceGenerator] sequence-based id generator; use org.hibernate.id.enhanced.SequenceStyleGenerator instead. See Hibernate Domain Model Mapping Guide for details.
2017-03-09 11:12:43.949 INFO 16837 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2017-03-09 11:12:44.464 INFO 16837 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for #ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext#6385cb26: startup date [Thu Mar 09 11:12:40 CET 2017]; root of context hierarchy
2017-03-09 11:12:44.546 INFO 16837 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2017-03-09 11:12:44.547 INFO 16837 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2017-03-09 11:12:44.576 INFO 16837 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-03-09 11:12:44.576 INFO 16837 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-03-09 11:12:44.614 INFO 16837 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-03-09 11:12:44.923 INFO 16837 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2017-03-09 11:12:44.988 INFO 16837 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-03-09 11:12:44.994 INFO 16837 --- [ main] qbs.QbsApplication : Started QbsApplication in 4.875 seconds (JVM running for 5.356)
You forgot to annotate your repository with #RepositoryRestResource. If you don't, Spring will not auto generate the url mappings and it will just act as a normal repository. This is a feature of spring-data-rest. So, in your case:
#RepositoryRestResource(collectionResourceRel = "invoices", path = "invoices")
public interface InvoiceRepository extends PagingAndSortingRepository<Invoice, Long> {
List<Invoice> findByIssuedBy(#Param("issuer")String issuer);
}
Now curl http://localhost:8080/invoices will return all invoices.
Refer to the Spring Data Rest documentation for more info.