Backend принимает только простой текст, без JSON и только имя, а не идентификатор - PullRequest
1 голос
/ 23 мая 2019

Итак, я хочу отправить данные на сервер в формате JSON.Пользователь должен выбрать опцию из списка данных, а идентификатор и имя будут отправлены на сервер REST.Когда я отправляю идентификатор и имя выбранной опции из списка данных, она выдает мне сообщение об ошибке: внутренняя ошибка сервера 500 и SyntaxError: JSON.parse: неожиданный символ в строке 1 столбца 1 данных JSON.

Я отредактировал данные, чтобы отправить имя на сервер только с помощью параметров отладки mozilla, затем он принимает запрос POST с ответом 201.Когда я отправляю только идентификатор, он выдает тот же 500 внутренних ошибок сервера.Почему он принимает его только при отправке имени?Как я могу изменить его так, чтобы запрос Get показывал идентификатор и имя?

Я использую Angular 7 для внешнего интерфейса и REST-сервер glassfish для внутреннего интерфейса.Я надеюсь, что кто-то может помочь мне.Я проверил формат JSON в контроллере JSON, и он прошел тест.Я предоставлю несколько фотографий в комментариях, чтобы показать вам, что я имею в виду.

Вот пример того, что я пытаюсь отправить:

{"id":3,"name":"Burger King"}

Что он принимает только:

{"name":"Burger King"}

FRONTEND

HTML-файл:

<label for="codes">Choose a restaurant:</label>
    <form
      (ngSubmit)="onOrganize(f)"
      #f="ngForm">
      <input type="text"  list="codes"  [(ngModel)]=codeValue [ngModelOptions]="{standalone: true}" (change)="saveCode($event)">
      <datalist id="codes">
        <option *ngFor="let c of codeList" [value]="c.name" >{{c.name}}</option>
      </datalist>
    </form>

Файл машинописи:

export class OrganizeComponent implements OnInit {

  public codeValue: string;

  codeList = [
    { restaurantId: 1, name: 'Mcdonalds' },
    { restaurantId: 2, name: 'Kentucky Fried Chicken' },
    { restaurantId: 3, name: 'Burger King' },
    { restaurantId: 4, name: 'Dominos pizza' },
    { restaurantId: 5, name: 'New York Pizza' }
  ];


  @ViewChild('f') form: NgForm;
  restaurant = {
    restaurantId: 1,
    name: " "
  };
   httpOptions = {
    headers: new HttpHeaders({
      'Content-Type':  'application/json',
      'Authorization': 'my-auth-token'
    })
  };


  constructor(private http: HttpClient) {
  }

  ngOnInit() {
  }

  public saveCode(e): void {
    let name = e.target.value;
    let list = this.codeList.filter(x => x.name === name)[0];



    this.restaurant.restaurantId =  list.restaurantId;
    this.restaurant.name = list.name;

console.log(list.restaurantId);
console.log(list.name);



    const httpOptions = {
      headers: new HttpHeaders({
        'Content-Type':  'application/json'
      })
    };

    const data = {
      id: list.restaurantId,
      name: list.name
    };

    console.log(data)
    var yourDataStr = JSON.stringify(data)

    this.http.post('http://localhost:8080/aquadine-jee/resources/restaurant',
      JSON.parse(JSON.stringify(data)) , httpOptions)


      .subscribe( // subscribe to observable http.post
        res => {
          console.log("response" + " " + res); // log results otherwise log error
        },
        err => {
          console.log('Error occured');
        }
      );
  }

BACKEND

Файл ресторана:

@Entity
@NamedQueries({
        @NamedQuery(name = "Restaurant.findOne", query = "select m from Restaurant m where m.id = :id"),
        @NamedQuery(name = "Restaurant.getAll", query = "select m from Restaurant m")
})
public class Restaurant {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;


//    @NotBlank
    private String naam;


//    @NotBlank
    private String adres;


    private int restaurantId;

    public Restaurant(){

    }


   public Restaurant( int id, int restaurantId, String naam) {
        this.id = id;
        this.restaurantId = restaurantId;
        this.naam = naam;
    }

 @GET
    @Produces("application/json")
        public Response all(){
             List<Restaurant> all = repositoryService.getAllRestaurants();
            return Response
                    .status(200)
                    .header("Access-Control-Allow-Origin", "*")
                    .entity(all)
                    .build();
        }


    @POST
    @Consumes("application/json")
    public Response save(Restaurant restaurant){
        repositoryService.save(restaurant);
        return Response
                .status(201)
                .build();
    }

Файл репозитория

// Restaurant services
    public List<Restaurant> getAllRestaurants(){

        return entityManager.createNamedQuery("Restaurant.getAll", Restaurant.class).getResultList();

    }

    public Restaurant find(Integer id){

        return entityManager.createNamedQuery("Restaurant.findOne", Restaurant.class).setParameter("id", id).getSingleResult();

    }

    public void save(Restaurant restaurant){
        entityManager.persist(restaurant);
    }
    public void update(Restaurant restaurant){
        entityManager.merge(restaurant);
    }
    public void delete(Restaurant restaurant){
        entityManager.remove(restaurant);
    }

1 Ответ

0 голосов
/ 23 мая 2019

Когда вы получаете, используя модальный класс в бэкэнде, отправленные вами данные должны быть сопоставлены с классом модели.Например:

Преобразование имен внутреннего интерфейса должно совпадать с получением данных

Вы отправляете

{"id":3,"name":"Burger King"}

Так что класс модели

Класс картографической модели

class Restaurant{
    Integer id; 
    String name; // your variable name is naam, so it won't map

    //Getters and setters
    //constructor -- You should have argument constructor 
}

Вы отправляете name, но в классе модели есть орфографическая ошибка naam

...