Развертывание приложения в Heroku, выдающее внутреннюю ошибку сервера 500 в Back End Java Spring Boot, в то же время отлично работающее в локальной среде - PullRequest
0 голосов
/ 21 апреля 2020

Добрый день, разработчики. В этом приложении я создаю небольшую проблему с процессом оценки, который я хочу реализовать. Будучи приложением, работающим на локальном хосте, идеально, но как только я разместил в Heroku, его журнал ошибок выдает мне эту ошибку на 500 Internal Error.

Я только что опубликовал это видео, чтобы вы могли увидеть любые случаи, которые я пытаюсь применить :

1-й случай (Передача объекта или целого числа для запроса параметра тела с приложением, работающим в локальном режиме, безупречная производительность) https://youtu.be/IdpHQg4FW7k

2-й случай (Передача целого числа в запрос Параметр body с приложением в heroku, ошибка 500) https://youtu.be/eJHSA_h8R3Y

3-й случай (Передача объекта на запрос параметра body с приложением в heroku, ошибка 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 голосов
/ 21 апреля 2020

Когда вы пишете @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...