Marília Muniz
Marília Muniz

Reputation: 1

POST request 404 not found

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?

Upvotes: 0

Views: 2493

Answers (1)

Ion Ionets
Ion Ionets

Reputation: 113

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

Upvotes: 1

Related Questions