【问题标题】:Spring boot Rest Api controller getting 404 errorSpring Boot Rest Api 控制器出现 404 错误
【发布时间】:2019-02-20 22:50:04
【问题描述】:

我通过在 Spring Boot 中使用 Rest 来公开我的服务。我首先通过使用 cxf jaxrs 依赖项和其他通过 spring rest 依赖项来使用 2 种不同的方法来公开我的服务。在第一种方法中,当我在邮递员中运行我的服务时出现 404 错误。但在第二种方法中,我得到了我的输出。请帮帮我。

使用 cxf jaxrs 的第一种方法

@Path("/locations")
public interface LocationRestController {

@GET
public List<Location> getLocations();
}
******************************************
@RestController
public class LocationRestControllerImpl implements LocationRestController {

@Autowired
LocationRepos repos;

@Override

public List<Location> getLocations() {

    return repos.findAll();
}}
{
"timestamp": "2018-09-17T03:36:05.283+0000",
"status": 404,
"error": "Not Found",
"message": "No message available",
"path": "/locationweb/locations"
}

使用spring内置依赖的第二种方法

@RestController
@RequestMapping("/locations")
public class LocationRestControllerImpl  {

@Autowired
LocationRepos repos;

@GetMapping
public List<Location> getLocations() {

    return repos.findAll();
}}

Pom 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.project.abhishek</groupId>
<artifactId>student</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>student</name>
<description>Student DAL</description>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
"pom.xml"   <version>2.1.0.M2</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <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>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <version>9.0.12</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
        <version>2.0.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>jfree</groupId>
        <artifactId>jfreechart</artifactId>
        <version>1.0.13</version>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxrs</artifactId>
        <version>3.2.6</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </pluginRepository>
</pluginRepositories>

【问题讨论】:

  • “但在第二种方法中,我得到了我的输出。”那有什么问题呢?
  • Traxx 的问题是为什么我不能用 cxf 依赖开发我的 rest api

标签: spring rest spring-boot cxf spring-restcontroller


【解决方案1】:

请参考下面的代码以正确实现

public interface LocationRestController {

public List<Location> getLocations();
}
******************************************
@RestController(value="/locationweb/locations")
public class LocationRestControllerImpl implements LocationRestController {

@Autowired
LocationRepos repos;

@Override
@GetMapping
public List<Location> getLocations() {

    return repos.findAll();
}}
{

【讨论】:

  • 感谢 Gaurav 它可以工作,但它类似于我的第二种方法,但我的问题是为什么我不能通过使用“@path”和“@get”注释作为“@getmapping”来使用 cxf 依赖项是弹簧内置绑定
  • 嗨 Abhishek,据我了解,@Path 仅适用于实现级别意味着类级别,而不是接口,这就是它不起作用的原因。
【解决方案2】:

这行可能是问题

@RestController
public class LocationRestControllerImpl implements LocationRestController {

从第一种方法中的类中删除 @RestController

【讨论】:

  • 那么你的设置有问题。首先检查 web.xml 以查看您注册了 Spring 或 Cfx 的 servlet。更多详细信息请参阅此baeldung.com/apache-cxf-with-spring
  • 我正在使用 spring boot 并且使用 cxf 依赖项
  • 在这种情况下使用 cxf-spring-boot-starter-jaxws 依赖并删除 spring-boot-starter-web。参考这个cxf.apache.org/docs/springboot.html
【解决方案3】:

试试这个例子, https://dzone.com/articles/spring-boot-building-restful-web-services-with-jersey

您很可能缺少 Spring/Jersey 集成或 Jersey 配置。

为 Spring boot 添加 Jersey 配置以了解 Jersey。

为方便起见,下面是 Jersey 配置的代码。

@Configuration
@ApplicationPath("rest")
public class Config extends ResourceConfig {

public Config() {       
}

@PostConstruct
public void setUp() {
    register(Controller.class);
}
}

【讨论】:

  • 如果我使用的是 cxf 那么需要添加 jersey 依赖项
【解决方案4】:

确保你有CXF configuration并设置为服务bean,就好像你使用@RestController你实际上没有实现CXF所以为了处理CXF的请求,你需要配置CXF服务器.

    @Configuration
    public class CXFConfig {

      @Autowired
      private Bus bus;


      @Bean
      public Server rsServer() {
         final JAXRSServerFactoryBean endpoint = new JAXRSServerFactoryBean();
         endpoint.setBus(bus);
         endpoint.setAddress("/");
         endpoint.setServiceBeans(Arrays.asList(LocationRestController ()));
         return endpoint.create();
      }

    @Bean
    public LocationRestController locationController() {
       return new LocationRestControllerImpl();
       }

    }

注意:无需实现控制器,直接拥有控制器即可。

【讨论】:

  • 无法得到它请解释一下。如果我使用 cxf 依赖项,为什么我应该有球衣配置
  • 你能分享你的 Pom 或 gradle 吗??
  • kj007 我已经添加了我的 Pom 文件
  • 您是否查看了我关于 CXF 配置的更新答案,您是否有这个问题并且在删除 @RestController 后仍然面临问题
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2019-08-14
  • 2021-12-18
  • 2021-05-04
  • 2020-10-11
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多