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);
}
但是基本上没有什么变化.....关于我如何处理此问题的任何想法? 预先感谢
答案 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