为什么我使用 spring-boot 时得到 404
Why do I get 404 for rest with spring-boot
我正在使用 Spring Boot 实现休息服务。实体 classes 在单独的包中定义。所以我在 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);
}
}
这是我的控制器class:
// 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);
}
}
我还创建了一个扩展 JPARepository 的 JPA 数据存储库,我在其中添加了自定义查询代码。
// 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);
}
下面是实现服务接口
的servicebeanclass
// 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 存储库内容并将控制器 class 更改为以下内容:
@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。
我要尝试的第一件事是将 @RequestMapping("/")
放在控制器的 class 定义中。在方法上保持相同的值。
与您的问题无关的另一件事是您不需要定义该自定义查询。 JPA 实际上足够智能,只需使用该方法名称即可执行您定义的查询。在此处查看 findByLastName
示例:https://spring.io/guides/gs/accessing-data-jpa/.
如果 spring boot starter web 不在您的 pom.xml 中,则添加相同的内容,原因可能是代码无法映射端点。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
==>您确定您的 Spring 引导应用程序 class 和您的 Rest 控制器在同一个基础包中吗?例如,如果您的 Spring 启动应用程序 class 的包是 com.example.demo,那么您的 Rest Controller 应该与 com.example.demo.controller.
在相同的基础包中
==>我认为这就是启动无法映射到您的休息控制器的 uri 的原因。因为@SpringBootApplication 已经嵌入了@ComponentScan 和@Configuration。尝试这样做。希望有用。
我正在使用 Spring Boot 实现休息服务。实体 classes 在单独的包中定义。所以我在 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);
}
}
这是我的控制器class:
// 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);
}
}
我还创建了一个扩展 JPARepository 的 JPA 数据存储库,我在其中添加了自定义查询代码。
// 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);
}
下面是实现服务接口
的servicebeanclass// 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 存储库内容并将控制器 class 更改为以下内容:
@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。
我要尝试的第一件事是将 @RequestMapping("/")
放在控制器的 class 定义中。在方法上保持相同的值。
与您的问题无关的另一件事是您不需要定义该自定义查询。 JPA 实际上足够智能,只需使用该方法名称即可执行您定义的查询。在此处查看 findByLastName
示例:https://spring.io/guides/gs/accessing-data-jpa/.
如果 spring boot starter web 不在您的 pom.xml 中,则添加相同的内容,原因可能是代码无法映射端点。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
==>您确定您的 Spring 引导应用程序 class 和您的 Rest 控制器在同一个基础包中吗?例如,如果您的 Spring 启动应用程序 class 的包是 com.example.demo,那么您的 Rest Controller 应该与 com.example.demo.controller.
在相同的基础包中==>我认为这就是启动无法映射到您的休息控制器的 uri 的原因。因为@SpringBootApplication 已经嵌入了@ComponentScan 和@Configuration。尝试这样做。希望有用。