将应用程序部署到Heroku时,在后端Java Spring Boot中引发500内部服务器错误,而在本地环境中运行完美

时间:2020-04-21 15:59:36

标签: javascript java spring-boot vue.js heroku

Good Day开发人员。在此应用中,我正在构建即时消息,该消息与我要实施的评级流程存在一些问题。在本地主机上运行该应用程序是完美的,但是一旦我在Heroku中发布,它的错误日志就会在500 Internal Error上引发此错误。

我刚刚发布了这些视频,以便您可以看到我尝试申请的两种情况:

第一种情况(通过传递对象或整数来请求主体参数,且应用程序在本地运行,性能理想) https://youtu.be/IdpHQg4FW7k

第二种情况(在Heroku中使用App将整数传递给请求主体参数,错误500) https://youtu.be/eJHSA_h8R3Y

第三种情况(在Heroku中使用App将对象传递给请求主体参数,错误500) https://youtu.be/_l-Z0I3hNZU

通过这些视频猜猜我将更详细地介绍正在发生的事情,尽管如此,我将在当前编辑之前将代码留在下面。感谢您的支持

基本上从前端,我只是通过请求正文参数发送一个速率(由用户在1-5个整数中选择):

COMPONENT in VUE
        functionx(){
         this.$store.dispatch("rateUpdater", {
            ratePack: {
              productRate: 4,
            },
            product_id: this.ProductCard.product_id,

          });
        }

VUEX Process

     rateUpdater({ dispatch }, { product_id, ratePack }) {
        fetch(url+"mini/all_products/user/product_rated/" + product_id, {
        credentials: "include",
        headers: {
          "Content-Type": "application/json",
        },
        method: "POST",
        body: JSON.stringify(ratePack),
      })
        .then((newData) => {
          return newData.json();
        })
        .then((data) => {
          if (data.Error) {
            data.Error
          } else {
            data;
            dispatch("fetchAllProducts");
          }
        })
        .catch((error)=> {
          alert("Request on Rate: ", error);
        });
    },

然后在后端接收数据,我刚开始在请求正文中将该变量初始化为Integer,原因是它来自前端的方式,然后基本上我将其更改为Double并认为可以工作:

CONTROLLER

importations

package com.miniAmazon;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;


@RequestMapping(value="/mini/all_products/user/product_rated/{id}",method = RequestMethod.POST)
    public ResponseEntity <Map<String,Object>>rateProductOnBuy(@PathVariable("id") Long id,  Authentication authentication
                                                                ,@RequestBody Integer productRated
    ){
        SOME CODE.....

        Product product=productRepository.getOne(id);

        Double rate=new Double(productRated)----------->transforming integer of request body to double 


        ---------------process of calculating average rate--------------------
        Double deframingRate=product.getProductRate()*product.getPeopleRating()+rate;
        Integer deframingPeopleVoting=product.getPeopleRating()+1;
        Double finalAverage=deframingRate/deframingPeopleVoting;

       -----------setting new Rate-------------
        product.setProductRate(finalAverage);

        ---------setting new amount of voters-----------
        product.setPeopleRating(deframingPeopleVoting);

        ---------saving repository----
        productRepository.save(product);

        return new ResponseEntity<>(makeMapResponse("Success","Product Rated"), HttpStatus.CREATED);
    }

但是基本上没有什么变化.....关于我如何处理此问题的任何想法? 预先感谢

1 个答案:

答案 0 :(得分:0)

当您写@RequestBody Integer productRated时,表示接受的请求正文只是一个数字。不能是包含数字键值对的对象。

您也许可以通过更改客户端来解决此问题,使其只发送一个数字,而不发送对象:

 rateUpdater({ dispatch }, { product_id, ratePack }) {
    fetch(url+"mini/all_products/user/product_rated/" + product_id, {
    credentials: "include",
    headers: {
      "Content-Type": "application/json",
    },
    method: "POST",
    body: ratePack.productRate, // just a number!
  })

但这不是很可扩展,因为您在体内发送的号码不能超过这个数字。

要使其具有可扩展性,您可以例如创建一个表示请求正文的类:

class YourRequestType {
    Integer productRate; // add getters, setters, if you want
}

并在控制器方法声明中使用该类。

@RequestBody YourRequestType productRated