簡體   English   中英

使用Spring Boot時無法訪問REST API

[英]Can't access REST API while using spring boot

所以即時通訊剛開始使用Spring Boot,我嘗試實施一項Crud服務。 我的代碼大部分來自於本教程Spring Boot Rest API Example ,我只是更改了變量名。 我發現啟動spring boot等所有問題,但是現在我無法訪問本地主機上的api。 我希望有一個人可以幫助我 :)

我的Application.java

package demo.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages= {"demo"})
public class App {

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

我的模型Game.java:

package demo.model;


public class Game {

private long id;

private String name;
private String genre;
private String studio;
private String publisher;


public Game(long id, String name, String genre, String studio, String publisher) {
    this.id = id;
    this.name = name;
    this.genre = genre;
    this.studio = studio;
    this.publisher = publisher;
}

public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getGenre() {
    return genre;
}
public void setGenre(String genre) {
    this.genre = genre;
}
public String getStudio() {
    return studio;
}
public void setStudio(String studio) {
    this.studio = studio;
}
public String getPublisher() {
    return publisher;
}
public void setPublisher(String publisher) {
    this.publisher = publisher;
}

@Override
public String toString() {
    return "Game [id=" + id + ", name=" + name + ", genre=" + genre + ", studio=" + studio + ", publisher="
            + publisher + "]";
  }
}

Api控制器RestApiController.java

package demo.app.controller;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.util.UriComponentsBuilder;

import demo.model.Game;
import demo.service.GameService;
import demo.util.CostumErrorType;


@RestController
@RequestMapping("/api")
public class RestApiController {
public static final Logger logger = LoggerFactory.getLogger(RestApiController.class);

@Autowired
GameService gameService; // Service which will do all data retrieval/manipulation work

//---------------Retrieve all games---------------------------------

@RequestMapping(value = "/game/", method = RequestMethod.GET)
public ResponseEntity<List<Game>> listAllGames() {
    List<Game> games = gameService.findAllGames();
    if(games.isEmpty()) {
        return new ResponseEntity(HttpStatus.NO_CONTENT);
        //TODO: vllt in HttpStatus.NOT_FOUND ändern
    }
    return new ResponseEntity<List<Game>>(games, HttpStatus.OK);
}

//---------------Retrieve Single Game---------------------------------


@RequestMapping(value = "/game/{id}", method = RequestMethod.GET)
public ResponseEntity<?> getGame(@PathVariable("id") long id) {
    logger.info("Fetching User with id {}", id);
    Game game = gameService.findById(id);
    if(game == null) {
        logger.error("Game with id {} not found.", id);
        return new ResponseEntity(new CostumErrorType("Game with id " + id + " not found"), HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity<Game>(game, HttpStatus.OK);
}

//---------------Create a Game---------------------------------

@RequestMapping(value= "/game/", method = RequestMethod.POST)
public ResponseEntity<?> createGame(@RequestBody Game game, UriComponentsBuilder ucBuilder){
    logger.info("Creating Game: {}", game);

    if(gameService.isGameExist(game)) {
        logger.error("Unable to create. A Game with name {} already exists.", game.getName());
        return new ResponseEntity(new CostumErrorType("Unable to create. A Game with name " + game.getName() + "already exists."), HttpStatus.CONFLICT);    
    }
    gameService.saveGame(game);

    HttpHeaders headers = new HttpHeaders();
    headers.setLocation(ucBuilder.path("/api/game/{id}").buildAndExpand(game.getId()).toUri());
    return new ResponseEntity<String>(headers, HttpStatus.CREATED);
    }
}

服務接口GameService.java:

package demo.service;

import java.util.List;

import demo.model.Game;

public interface GameService {

  Game findById(long id);

  Game findByName(String name);

  void saveGame(Game game);

  void updateGame(Game game);

  void deleteGameByName(String name);

  List<Game> findAllGames();

  void deleteAllGames();

  boolean isGameExist(Game game);

}

GameServiceImpl.java的實現:

package demo.service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

import org.springframework.stereotype.Service;

import demo.model.Game;

@Service("gameService")
public class GameServiceImpl implements GameService{

private static final AtomicLong counter = new AtomicLong();

private static List<Game> games;

static {
    games = populateDummyGames();
}

public List<Game> findAllGames(){
    return games;
}

public Game findById(long id) {
    for(Game game : games) {
        if(game.getId() == id) {
            return game;
        }
    }
    return null;
}

public Game findByName(String name) {
    for(Game game : games) {
        if(game.getName().equalsIgnoreCase(name)) {
            return game;
        }
    }
    return null;
}

public void saveGame(Game game) {
    game.setId(counter.incrementAndGet());
    games.add(game);
}

public void updateGame(Game game) {
    int index = games.indexOf(game);
    games.set(index, game);
}

public void deleteGameById(long id) {

    for (Iterator<Game> iterator = games.iterator(); iterator.hasNext();) {
        Game game = iterator.next();
        if (game.getId() == id) {
            iterator.remove();
        }
    }
}

public void deleteGameByName(String name) {

    for (Iterator<Game> iterator = games.iterator(); iterator.hasNext();) {
        Game game = iterator.next();
        if (game.getName().equalsIgnoreCase(name)) {
            iterator.remove();
        }
    }
}

public boolean isGameExist(Game game) {
    return findByName(game.getName())!=null;
}

public void deleteAllGames() {
    games.clear();
}

private static List<Game> populateDummyGames(){
    List<Game> games = new ArrayList<Game>();
    games.add(new Game(counter.incrementAndGet(), "The Elder Scrolls V: Skyrim", "RPG", "Bethesda Game Studios", "Bethesda"));
    games.add(new Game(counter.incrementAndGet(), "Halo: Combat Evolved", "First-Person-Shooter", "Bungie", "Microsoft"));
    games.add(new Game(counter.incrementAndGet(), "Doom", "First-Person-Shooter", "ID-Studios", "Bethesda"));

    return games;
  }
}

在我啟動spring boot應用程序並通過curl將請求發送到localhost:8080之后,沒有鏈接到我的api。

編輯我忘了包括我的pom.xml文件。 也許與問題有關:

<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</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>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
</project>

編輯:
我想通了...我有點傻。 在RestApiController.java中,第一個方法的RequestMapping設置為

/game/  

這對我來說毫無意義。 所以我只嘗試通過localhost:8080 / api / game訪問它。 通過localhost:8080 / api / game /訪問時,它工作正常。.對不起,..但是謝謝您的幫助!

好吧,我相信問題是:

@SpringBootApplication(scanBasePackages= {"demo"})

嘗試將其更改為

@SpringBootApplication(scanBasePackages= {"demo.app"})

要么

@SpringBootApplication
@EnableAutoConfiguration

使用@EnableAutoConfiguration,spring將自動配置您需要的bean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM