当前位置: 首页 > 知识库问答 >
问题:

使用Spring Boot的Restapi不通过角返回数据到客户端:从浏览器产生404响应

施选
2023-03-14

我对这一切都很陌生。这就是问题所在。我有一个RESTAPI,使用Spring Boot连接到MySQL。访问我的API的URL是http://localhost/videogamereview/review/(id)。每当我访问这个URL时,我都会按预期获得JSON对象。

我还有一个单独的angular项目,它通过自己的路径连接到此API。例如:HTTP:localhost:8080/angular2/#!/应该调用API,但是我从浏览器收到404响应。

Spring配置文件:

package com.init;

import java.util.Properties;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan(basePackages = "com")
@EnableTransactionManagement

public class MvcConfiguration extends WebMvcConfigurerAdapter {

    private static final String DATABASE_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/videogamereviews?verifyServerCertificate=false&useSSL=true";
    private static final String DATABASE_USERNAME = "root";
    private static final String DATABASE_PASSWORD ="random";

    private static final String HIBERNATE_DIALECT = "org.hibernate.dialect.MySQLDialect";
    private static final String HIBERNATE_SHOW_SQL = "true";
    private static final String ENTITYMANAGER_PACKAGES_TO_SCAN = "com.model";
    private static final String HIBERNATE_HBM2DDL_AUTO = "create-drop";
//  private static final String HIBERNATE_HBM2DDL_AUTO = "update";

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(DATABASE_DRIVER);
        dataSource.setUrl(DATABASE_URL);
        dataSource.setUsername(DATABASE_USERNAME);
        dataSource.setPassword(DATABASE_PASSWORD);
        return dataSource;
    }

    @Bean
    public CorsFilter corsFilter() {

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); // you USUALLY want this
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }



    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource());
        sessionFactoryBean.setPackagesToScan(ENTITYMANAGER_PACKAGES_TO_SCAN);
        sessionFactoryBean.setHibernateProperties(hibernateProperties());
        return sessionFactoryBean;
    }

    private Properties hibernateProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect", HIBERNATE_DIALECT);
        properties.put("hibernate.show_sql", HIBERNATE_SHOW_SQL);
        properties.put("hibernate.hbm2ddl.auto", HIBERNATE_HBM2DDL_AUTO);
        return properties;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }

    @Bean
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/css/**").addResourceLocations("/resources/");
    }
}

Spring我的控制器:ReviewController。Java语言

package com.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
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 com.model.Review;
import com.service.ReviewService;

@RestController
@RequestMapping(value = "review")
@CrossOrigin(origins="http://localhost:8080")

public class ReviewController {

    @Autowired
    private ReviewService rs;

    @RequestMapping(value="/",method = RequestMethod.GET)
    public List<Review> getReviews() {
        return rs.getReviews();
    }

    @RequestMapping(value = "{id}", method = RequestMethod.GET)
    public Review showReviewWithId(@PathVariable long id) {
        return rs.getReviewById(id);

    }


    @RequestMapping(value = "{id}", method = RequestMethod.PUT)
    public String updateReviews(@PathVariable long id, @RequestBody Review review) {
        rs.updateReview(id,review);
        return "review updated";
    }

    @RequestMapping(value = "{id}", method = RequestMethod.DELETE)
    public String delete(@PathVariable long id) {
        rs.deleteReview(id);
        return "review deleted";
    }



    @RequestMapping(value="/",method = RequestMethod.POST)
    public String postReview(@RequestBody Review review) {
        rs.saveReview(review);
        return "review created";
    }

}



angular setup: app.js
    'use strict';

    var VideogameReviewsApp = angular.module('VideogameReviewsApp', ['ngRoute','ngResource']).
         config(['$routeProvider', function ($routeProvider) {
            $routeProvider.
                when('/', { controller: ReviewCtrl, templateUrl: 'review.html" target="_blank">html' }).
                otherwise({ redirectTo: '/' });
         }]);

    VideogameReviewsApp.factory('Review', function ($resource) {
        return $resource('http://localhost/videogamereviews/review/:id.json', { id: '@id' }, 


                { update: { method: 'PUT' } });
    });

    var ReviewCtrl = function ($scope,Review) {
        alert("haha");
        $scope.reviews = Review.query();
    };

在浏览器标题部分,我可以看到正在访问的URL是http://localhost/videogamereviews/review.json.那么为什么我得到一个404

回答提前感谢!艾希礼

共有3个答案

靳越
2023-03-14

您的url有冒号(:),这是导致问题的原因。只需在浏览器中粘贴您的资源uri(在浏览器控制台中检查有关响应的信息)或使用postman即可。从spring控制器获得的GET请求应如下所示:

  • 对于所有ID:-“localhost/videogamereviews/review”

我还考虑localhost映射到localhost:{app server portno}.(即localhost:8080),上下文根是视频游戏视图。

单于淇
2023-03-14

根据审查,控制器审查应通过http://localhost/review具有给定id的审查应该可以通过http://localhost/review/YOUR_REVIEW_ID

所以你必须从请求url的末尾删除. json。

常甫
2023-03-14

如果http://localhost/videogamereview/review/(id)返回预期的JSON,那么在Angular脚本中使用它。这意味着当您想要检索资源时,在uri中删除. json。http://localhost/videogamereview/review/(id)返回JSON资源,但http://localhost/videogamereview/review/(id). json不是。

 类似资料:
  • 问题内容: 我想创建一个应用程序,当超级用户单击链接时,用户应该获得通知或类似pdf的内容,以便他们在屏幕上访问。 用例:当教师想与他的学生共享PDF时,他应该能够通知他的学生有关可下载的pdf的信息,并且必须提供一个链接来做到这一点。 问题答案: 当您想在CakePHP中实现此功能(因此我假设它是基于Web的应用程序)时,用户必须打开“活动”页面才能接收推送消息。 值得一看前两个答案,但也只需考

  • 问:在支持服务器的java应用程序中,是否可以在Spring使用websocket将数据从服务器发送到客户端,而不创建另一个客户端? 互联网上几乎所有关于spring中websocket的文章都展示了如何在控制器中定义方法来处理请求。当他们用两个注解@MessageMapping("/news ")、@SendTo("/topic/news ")定义一个函数时,所有的神奇似乎都发生了。单凭这个方法

  • 我有一个在生产中工作的密钥斗篷,我需要我的用户登录到一个使用react native开发的移动应用程序,使用该密钥斗篷。到目前为止,我使用的正常登录流程通过应用内浏览器作为AppAtuh,但现在我收到了一个用户的请求,说在应用程序,同时登录。 > 我使移动登录的Keycloak主题对移动应用程序UI进行了如此多的加密,以至于可以将其作为普通屏幕使用react WebView打开。 其次,这种思想适

  • 问题内容: 是否有从客户端浏览器获取时区的可靠方法?我看到了以下链接,但我想要一个更强大的解决方案。 使用JavaScript自动检测时区 JavaScript中的时区检测 问题答案: 查看此存储库pageloom很有帮助 下载jstz.min.js并将功能添加到您的html页面 然后从您的显示代码调用此函数

  • 问题内容: 以下是我的tls后端: 密钥是使用以下两行生成的: 当我启动tls服务器并使用浏览器(https://example.com:8443)访问站点时, 在 忽略浏览器警告 后 ,我得到了预期的结果: 到目前为止,一切都很酷。 现在,当我将浏览器指向http://example.com:8443(注意使用的是http, 而不是 https)时,我得到了Firfox的以下结果(Chrome浏

  • 我正在进行一个SpringBoot项目,该项目使用常规MVC机制来公开REST API。 在一个特定的GET API中,我得到了406HTTP响应。 下面是我的控制器方法的样子: AnalysisDetailResponse是使用Lombok创建的(在其他API的情况下,Lombok可以完美地工作) 我已经验证了整个响应对象的内容,它似乎是完美的。然而,响应总是406。 我需要JSON格式的响应,