簡體   English   中英

為什么我要讓404彈簧靴休息一下

[英]Why do I get 404 for rest with spring-boot

我正在使用Spring Boot實現rest服務。 實體類在單獨的程序包中定義。 因此,我在Application.java中添加了組件注釋。

@Configuration
@EnableAutoConfiguration
@ComponentScan("org.mdacc.rists.cghub.model")
@EnableJpaRepositories(basePackages = "org.mdacc.rists.cghub.model") 
public class Application 
{
    public static void main( String[] args )
    {
        SpringApplication.run(Application.class, args);
    }
}

這是我的控制器類:

// SeqController.java
@RestController
public class SeqController {

    @Autowired
    private SeqService seqService;
    @RequestMapping(
            value = "/api/seqs", 
            method = RequestMethod.GET, 
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<List<SeqTb>> getSeqs() {
        List<SeqTb> seqs = seqService.findAll();

        return new ResponseEntity<List<SeqTb>>(seqs, HttpStatus.OK);
    }
}

我還創建了一個JPA數據存儲庫,該存儲庫擴展了JPARepository,並在其中添加了自定義查詢代碼。

// SeqRepository.java
@Repository
public interface SeqRepository extends JpaRepository<SeqTb, Integer> {

    @Override
    public List<SeqTb> findAll();

    @Query("SELECT s FROM SeqTb s where s.analysisId = :analysisId")
    public SeqTb findByAnalysisId(String analysisId);
}

下面是實現服務接口的servicebean類

// SeqServiceBean.java
@Service
public class SeqServiceBean implements SeqService {
    @Autowired
    private SeqRepository seqRepository;

    @Override
    public List<SeqTb> findAll() {
        List<SeqTb> seqs = seqRepository.findAll();
        return seqs;
    }

    public SeqTb findByAnalysisId(String analysisId) {
        SeqTb seq = seqRepository.findByAnalysisId(analysisId);
        return seq;
    }
}

當我啟動應用程序並在瀏覽器中輸入以下URL“ http:// localhost:8080 / api / seqs ”時,出現404錯誤。 我錯過了什么?

編輯#1:我決定取出JPA存儲庫中的東西,並將控制器類更改為以下內容:

@RestController
//@RequestMapping("/")
public class SeqController {
    private static BigInteger nextId;
    private static Map<BigInteger, Greeting> greetingMap;

    private static Greeting save(Greeting greeting) {
        if(greetingMap == null) {
            greetingMap = new HashMap<BigInteger, Greeting>();
            nextId = BigInteger.ONE;
        }
        greeting.setId(nextId);
        nextId = nextId.add(BigInteger.ONE);
        greetingMap.put(greeting.getId(), greeting);
        return greeting;
    }

    static {
        Greeting g1 = new Greeting();
        g1.setText("Hello World!");
        save(g1);

        Greeting g2 = new Greeting();
        g1.setText("Hola Mundo!");
        save(g2);

    }
    @RequestMapping(
            value = "/api/greetings", 
            method = RequestMethod.GET, 
            produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Collection<Greeting>> getGreetings() {
        Collection<Greeting> greetings = greetingMap.values();
        return new ResponseEntity<Collection<Greeting>>(greetings, HttpStatus.OK);

    }
}

當我啟動應用程序並將“ localhost:8080 / api / greetings”放入瀏覽器時,我仍然得到404。

如果您的pom.xml中沒有spring boot starter web,則添加相同的內容,原因可能是代碼無法映射端點。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

==>您確定您的Spring Boot應用程序類和Rest Controller是否在同一基本包中? 例如,如果您的Spring Boot應用程序類的軟件包是com.example.demo,則您的Rest Controller應該與com.example.demo.controller位於同一基本軟件包中。

==>我認為這是引導無法映射到Rest Controller的uri的原因。 因為@SpringBootApplication已經嵌入了@ComponentScan和@Configuration。 嘗試這樣做。 我希望它能起作用。

我要嘗試的第一件事是將@RequestMapping("/")放在控制器的類定義上。 在方法上保持相同的值。

與您的問題無關的另一件事是,您無需定義該自定義查詢。 JPA實際上很聰明,僅使用該方法名即可執行您定義的查詢。 在此處查看findByLastName示例: https : findByLastName

暫無
暫無

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

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