Niedziałający GET i POST w Spring Gradle

0

Cześć,

Ostatnio stworzyłem prostą aplikację w Spring mająca na celu przetrzymywać dane o albumach muzycznych. Niestety endpoint'y GET oraz POST nie działają (kiedy próbuję przesłać np. GET request Postman'em zwracana jest wartość 404). Poniżej cały kod aplikacji:

public interface AlbumRepository extends Repository<Album,Long> {
    @Query(value = "SELECT * FROM album", nativeQuery = true)
    List<Album> findAlbums();

    Album save(Album persisted);
}

@Service
public class AlbumService {
    @Autowired
    private AlbumRepository albumRepository;

    public void saveData(Album album) {
        this.albumRepository.save(album);
    }

    public List<Album> getAllAlbums() {
        return this.albumRepository.findAlbums();
    }

    @PostConstruct
    private void init() {}
}

@Entity
@Table(name="album")
public class Album {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @Column(name="title")
    private String title;
}

@RestController
public class AlbumController {
    @Autowired
    AlbumService albumService;

    @RequestMapping(method=RequestMethod.POST, path="/album/post")
    public ResponseEntity<String> addAlbum(@RequestBody Album album) {
        albumService.saveData(album);
        return new ResponseEntity<String>(HttpStatus.OK);
    }

    @RequestMapping(method=RequestMethod.GET, path="/album/get")
    Iterable<Album> getAlbums() {
        return albumService.getAllAlbums();
    }
}

@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class MusesiteBackEndApplication {

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

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

}

Czego już próbowałem:

  1. Dodać anotację @ComponentScan do klasy MusesiteBackEndApplication z pakietami aplikacji.
  2. Dodać Bean dataSource, który powinien stworzyć bazę danych.
  3. Dodać do adnotacji SpringBootApplication parametr scanBasePackages z nazwami pakietów aplikacji.
  4. Dodać adnotację @Repository do AlbumRepository. Niestety Spring IDE nie rozpoznaje Repository jako adnotacji.

Będę wdzięczny za pomoc.

0

Na jaki URL strzelasz?

0

localhost:8090/album/get

0

Zmieniałeś port? Domyślnie jest 8080. Pokaż plik z konfiguracją Springa - properties albo yaml

0

Tak, specjalnie zmieniłem port na inny.

0

Pokaż jakie masz zależności w projekcie

0

Spróbuj tak
localhost:8090/nazwaAplikacji/album/get

0

@bames - zależności:

dependencies {
	implementation('org.springframework.boot:spring-boot-starter-actuator')
	implementation('org.springframework.boot:spring-boot-starter-data-jpa')
	implementation('org.springframework.boot:spring-boot-starter-web')
	testImplementation('org.springframework.boot:spring-boot-starter-test')
}

@diligentia - próbowałem localhost:8090/musesite-back-end/album/get (gdzie musesite-back-end - nazwa aplikacji) oraz localhost:8090/musesitebackend/album/get, jednak bez skutku.
Przy starcie IDE wyświetla:

2019-01-31 16:16:00.302  INFO 4453 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 2 endpoint(s) beneath base path '/actuator'
2019-01-31 16:16:00.365  INFO 4453 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8090 (http) with context path ''
0
@RequestMapping(method=RequestMethod.GET, path="/album/get")

spróbuj

@RequestMapping(method=RequestMethod.GET, value="/album/get")
0

@teez: Brak reakcji.
Wszedłem pod: http://localhost:8090/album/get
Reakcja:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Jan 31 17:09:10 CET 2019
There was an unexpected error (type=Not Found, status=404).
No message available
0

Wrzuć logi ze startu aplikacji

0

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

2019-01-31 17:08:53.665  INFO 8564 --- [           main] c.m.m.MusesiteBackEndApplication         : Starting MusesiteBackEndApplication on xxx with PID 8564 (/home/xxx/Documents/Programming/musesite/musesite-back-end/bin/main started by root in /home/xxx/Documents/Programming/musesite/musesite-back-end)
2019-01-31 17:08:53.667  INFO 8564 --- [           main] c.m.m.MusesiteBackEndApplication         : No active profile set, falling back to default profiles: default
2019-01-31 17:08:54.217  INFO 8564 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-01-31 17:08:54.230  INFO 8564 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 8ms. Found 0 repository interfaces.
2019-01-31 17:08:54.708  INFO 8564 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8090 (http)
2019-01-31 17:08:54.727  INFO 8564 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-01-31 17:08:54.727  INFO 8564 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/9.0.13
2019-01-31 17:08:54.734  INFO 8564 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib]
2019-01-31 17:08:54.805  INFO 8564 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-01-31 17:08:54.805  INFO 8564 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1112 ms
2019-01-31 17:08:55.152  INFO 8564 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-01-31 17:08:55.346  INFO 8564 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 2 endpoint(s) beneath base path '/actuator'
2019-01-31 17:08:55.397  INFO 8564 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8090 (http) with context path ''
2019-01-31 17:08:55.400  INFO 8564 --- [           main] c.m.m.MusesiteBackEndApplication         : Started MusesiteBackEndApplication in 1.934 seconds (JVM running for 2.196)
2019-01-31 17:09:05.614  INFO 8564 --- [nio-8090-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-01-31 17:09:05.614  INFO 8564 --- [nio-8090-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-01-31 17:09:05.619  INFO 8564 --- [nio-8090-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms

0

Zamiast @RequestMapping daj @GetMapping i @PostMapping

0

@bames:

0

Pokaż strukture plików w projekcie

0

@Neqero:
Próbowałem: @GetMapping(path="/album/get", consumes = "application/json", produces = "application/json") oraz @GetMapping(path="/album/get") bez skutku.

0

@bames: Struktura plików w projekcie:

1

Klasa MuseSite cośtam Application jest w złym pakiecie, przez co Spring nie znajduje przy domyślnej konfiguracji innych klas, które tam masz. Przenieś tą klasę o jeden poziom wyżej i zacznie działać, albo musisz dodać @ComponentScan z odpowiednimi pakietami.

0

@bames:
Obecnie moja struktura plików wygląda jak na załączonym obrazku. Po uruchomieniu aplikacja nie startuje, output poniżej:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field albumRepository in com.musesite.dao.AlbumService required a bean named 'entityManagerFactory' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean named 'entityManagerFactory' in your configuration.

Próbowałem dodać @ComponentScan({"com.musesite.dao", "com.musesite.model", "com.musesite.musesitebackend", "com.musesite.restful"}) do klasy MusesiteBackEndApplication, jednak dostaje ten sam błąd. Próbowałem zastosować się do zaleceń dotyczących entityManagerFactory na stackoverflow, ale bez skutku.

1

Struktura plików jest ok. Żaden @ComponentScan nie jest potrzebny. Aplikacja nie może wstać przez te excludy które masz w @EnableAutoConfiguration. Usuń to i tego beana DataSource to wstanie. Upewnij się, że masz odpowiednie informacje w pliku properties/yaml.

0

@bames:
Bez tego bean'a i exclude'ów aplikacja nie uruchamia się. Błąd jaki się okazuje to:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

Próbowałem:

  1. Skonfigurować plik properties w taki sposób:
server.port = 8090
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:8090/world
spring.datasource.username=root
spring.datasource.password=admin

wtedy dostaję błąd:

Failed to bind properties under '' to com.zaxxer.hikari.HikariDataSource:
    Property: driverclassname
    Value: com.mysql.cj.jdbc.Driver
    Origin: "driverClassName" from property source "source"
    Reason: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader
  1. Próbowałem także skonfigurować bazę w ten sposób:
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

ale wtedy dostaję dość duży error w załączniku.

0

W ogóle masz dodany driver dla MySQL'a w gradlu?

0

@vizzini: Tak dodałem compile 'mysql:mysql-connector-java', ale mam te same błędy.

1

Ze stacktrace jasno wynika, że błąd jest przy ładowaniu tego drivera IllegalStateException: Cannot load driver class: com.mysql.jdbc.Driver, szybkie spojrzenie w google mówi, że ta klasa jest @Deprecated i powinno się używać com.mysql.cj.jdbc.Driver , natomiast jak usuniesz tą linię całkowicie to Spring Boot powinien sobie umieć poradzić. Tutaj masz tutorial do tego https://spring.io/guides/gs/accessing-data-mysql/

0

Dzięki wielkie! W końcu działa!

1 użytkowników online, w tym zalogowanych: 0, gości: 1