0
votes

Created two applications based ON examples from Web: Frontend in Angular and customer) Angular URL: http://localhost:4200/ Spring Boot URL: http://localhost:9020/ (REST: http://localhost:9020/api/)

Based on Instructions from experts here to my previous questions (https://stackoverflow.com/posts/58685251) I am facing new exeptions for that I am not able to fix it in my own.

Angular Part

export class Customer {
    id: number;
    firstname: string;
    lastname: string;
    age: number;
    active: boolean;}

.

import { Component, OnInit } from '@angular/core';

import { Customer } from '../customer';
import { CustomerService } from '../customer.service';

@Component({
  selector: 'create-customer',
  templateUrl: './create-customer.component.html',
  styleUrls: ['./create-customer.component.css']
})
export class CreateCustomerComponent implements OnInit {

  customer: Customer = new Customer();
  submitted = false;

  constructor(private customerService: CustomerService) { }

  ngOnInit() {
  }

  newCustomer(): void {
    this.submitted = false;
    this.customer = new Customer();
  }

  save() {

    this.customerService.createCustomer(this.customer)
      .subscribe(data => {console.log(data);
        console.log(this.customer);
        this.submitted = true;},error => console.log(error));
    this.customer = new Customer();
    this.customer.firstname="HHH";

}

  onSubmit() {

    this.save();
  }
}

.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Customer } from './customer';

@Injectable({
  providedIn: 'root'
})
export class CustomerService {

  private baseUrl = 'http://localhost:9020/api/';

  constructor(private http: HttpClient) { }

  getCustomer(id: number): Observable<Object> {
    return this.http.get(`${this.baseUrl}` + `customers/${id}`);
  }

  createCustomer(customer: Customer): Observable<Object> {
    console.log(customer);
   return this.http.post(`${this.baseUrl}` + `create`, customer);
  }

  updateCustomer(id: number, value: any): Observable<Object> {
    return this.http.put(`${this.baseUrl}/${id}`, value);
  }

  deleteCustomer(id: number): Observable<any> {
    return this.http.delete(`${this.baseUrl}` + `customers/${id}`, { responseType: 'text' });
  }

  getCustomersList(): Observable<any> {
    return this.http.get(`${this.baseUrl}` + `customers`);
  }

  getCustomersByAge(age: number): Observable<any> {
    return this.http.get(`${this.baseUrl}` + `customers/age/${age}`);
  }

  deleteAll(): Observable<any> {
    return this.http.delete(`${this.baseUrl}` + `customers/delete`, { responseType: 'text' });
  }
}

.

CREATE TABLE customer(
   id INT NOT NULL AUTO_INCREMENT,
   firstname VARCHAR(20) NOT NULL,
   lastname VARCHAR(20) NOT NULL,
   age INT,
   active boolean,
   PRIMARY KEY (id)
);

application.properties:

- server.port=9020 
 - spring.datasource.url=jdbc:h2:file:./testdb
 - spring.datasource.username=H2 spring.datasource.password=password
 - spring.jpa.hibernate.ddl-auto = update 
 - spring.jpa.show-sql=true

Spring Boot

@CrossOrigin(origins = "http://localhost:4200")
@RestController
@RequestMapping("/api")
public class CustomerController {

  @Autowired
  CustomerRepository repository;

  @RequestMapping(value = "/create")
  public ResponseEntity<Customer> postCustomer(@RequestBody Customer customer) {
    try {
    LOG.setLevel(Level.ALL);
    LOG.info("public ResponseEntity<Customer> postCustomer(@RequestBody Customer customer");
    LOG.info("customer.getFirstName(): "+customer.getFirstName());
    //new Customer(customer.getId(),customer.getFirstName(),customer.getLastName(),customer.getAge(),customer.isActive())
      Customer _customer = repository.save(customer);
      return new ResponseEntity<>(_customer, HttpStatus.CREATED);
    } catch (Exception e) {
      return new ResponseEntity<>(null, HttpStatus.EXPECTATION_FAILED);
    }
  }

.

@ResponseBody
@Entity
@Table(name = "Customer")
public class Customer implements Serializable {

    private static final long serialVersionUID = -3009157732242241606L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "lastname")
    private String lastname;

    @Column(name = "firstname")
    private String firstname;

    @Column(name = "age")
    private int age;

    @Column(name = "active")
    private boolean active = true;

    public Customer() {
    }


    public Customer(String firstName, String lastName, int age, boolean active) {
        this.firstname = firstName;
        this.lastname = lastName;
        this.age = age;
        this.active=active;
    }

    public long getId() {
        return id;
    }

    public String getFirstName() {
        return firstname;
    }

    public void setFirstName(String firstName) {
        this.firstname = firstName;
    }

    public void setLastName(String lastName) {
        this.lastname = lastName;
    }

    public String getLastName() {
        return this.lastname;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return this.age;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    @Override
    public String toString() {
        String info = String.format("Customer info: id = %d, firstname = %s, lastname = %s, age = %d", firstname,
                lastname, age, id);
        return info;
    }
}

Expect result ist persisting customer with proper Firstname and Lastname but I am getting exception:

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Thu Nov 07 17:53:03 CET 2019
There was an unexpected error (type=Bad Request, status=400).
Required request body is missing: public org.springframework.http.ResponseEntity<.model.Customer> .controller.CustomerController.postCustomer(model.Customer)
org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<model.Customer> .controller.CustomerController.postCustomer(com.javasampleapproach.mysql.model.Customer)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:127)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:167)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
2
Can you please remove @ResponseBody from the Customer entity class?reflexdemon
In that case I didnt get Exception but the fields lastname and fristname are still null although I add strings: `{"id":42,"age":99,"active":true,"lastName":null,"firstName":null}``Kyra
Change the @RequestMapping(value = "/create") to @PostMapping(value = "/create")reflexdemon
Hi @reflexdemon unfortanetly no improvementsKyra
Hi @reflexdemon I was not able to fix this issue until now. I am faching stil the exception: Sun Nov 10 21:19:14 CET 2019 There was an unexpected error (type=Method Not Allowed, status=405). Request method 'GET' not supported org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:200)Kyra

2 Answers

0
votes

You are doing like this only when you return ResponseEntity <>:

   @RequestMapping(value = "${jwt.route.registration.path}", method = RequestMethod.POST)
   public ResponseEntity<User> registration(@RequestBody ExternalUser externalUser){
       System.out.println(externalUser.getUsername());
   User userInstance=((JwtUserDetailsService)userDetailsService).saveUser(externalUser);
   return new ResponseEntity<User>(userInstance,HttpStatus.OK);
    }
0
votes

Try to do like this:

 @RequestMapping(value = "/create")
    public ResponseEntity<Customer> postCustomer(@RequestBody Customer customer) {
        try {
            LOG.setLevel(Level.ALL);
            LOG.info("public ResponseEntity<Customer> postCustomer(@RequestBody Customer customer");
            LOG.info("customer.getFirstName(): "+customer.getFirstName());
            //new Customer(customer.getId(),customer.getFirstName(),customer.getLastName(),customer.getAge(),customer.isActive())
            Customer _customer = repository.save(customer);
            return new ResponseEntity<Customer>(_customer, HttpStatus.CREATED);
        } catch (Exception e) {
            return new ResponseEntity<Customer>(null, HttpStatus.EXPECTATION_FAILED);
        }
    }