Отправить POST-запрос от React Component в Spring Boot Controller - PullRequest
0 голосов
/ 24 марта 2020

Итак, у меня есть компонент React, который называется UpdateJobComponent. Отсюда пользователь может либо обновить задание, либо создать задание (в зависимости от кнопки, которую он щелкнул в предыдущем компоненте). Обновление задания работает нормально, однако, когда я пытаюсь создать работу, я получаю следующие ошибки:

Ошибки

Put http://localhost : 8080 / jobs / -1 500

Uncaught (в обещании) Ошибка: запрос не выполнен с кодом состояния 500 при createError

Он сообщает, что это запрос PUT, а не Почта. Однако я подумал, что правильно сказал, чтобы он соответствовал контроллеру createJob PostMapping. Ниже приведен код UpdateJobComponent, а также служебные файлы и контроллер, а также JobDataService.

. Я совершенно уверен, что метод updateJob в моем JobController получает POST и вот почему я получаю проблему, но я не могу понять, как заставить createJob в JobController получить его.

Если вы хотите больше увидеть код, просто дайте мне знать, я постарался урезать его настолько, насколько это возможно, чтобы не слишком долго просматривать! Буду очень признателен за любую помощь, которую вы можете предложить!

UpdateJobComponent

// imports

class UpdateJobComponent extends Component {
  constructor(props) {
      super(props)

      this.state = {
        id: this.props.match.params.id,
        employer: this.props.match.employer,
        description: ''
      }
      // bind methods
  }
  componentDidMount() {
    if (this.state.id == -1) {
        console.log("Not mounting")
        return;
    }
    console.log(this.state.id)
    console.log("mounting")
    let userName = AuthenticationService.getLoggedUser()

    JobDataService.retrieveJob(userName, this.state.id)
    .then(response => this.setState({
        description: response.data.description,
        employer: response.data.employer,
        jobTitle: response.data.jobTitle
        }))
  }

  //    Error handling for form
  validate(values) {
    let errors = {} //  add validation for every field!!!!!!
    if (!values.description) {
        errors.description = 'Enter a description'
    } else if (values.description.length < 5) {
        errors.description = 'Description must be at least 5 characters long'
    }
    return errors
  }

  //    When save is clicked
  onSubmit(values) {
    // let employer = this.state.employer
    // let id = this.state.id
    // let jobTitle = this.state.jobTitle
    let job = {
        id: this.state.id,
        employer: values.employer,
        jobTitle: values.jobTitle,
        description: values.description
    }

    if (this.state.id === -1) {
        JobDataService.createJob(job)
            .then(() => this.props.history.push('/jobs'))
    } else {
        JobDataService.updateJob(job.jobTitle, job.employer, this.state.id, job)
            .then(() => this.props.history.push('/jobs'))
    }
  }

  render() {
    let { description, employer, jobTitle } = this.state
    return (
        <div>            
            <h3>Update {this.state.employer}'s {this.state.jobTitle} Job</h3>
            <div className="container">
                <Formik
                    initialValues={{description: description, employer: employer, jobTitle: jobTitle}}

                    onSubmit={this.onSubmit}
                    validateOnChange={false}
                    validateOnBlur={false}
                    validate={this.validate}
                    enableReinitialize={true}    
                >
                {
                    (props) => (
                        <Form>
                            // Formik form, removed to make post smaller...

                                <div className="btn-group mr-2" role="group" aria-label="First group">
                                    <button className="btn btn-success" type="submit">Save</button>
                                </div>


JobDataService

// imports
const API_URL = 'http://localhost:8080'
const GET_ALL_JOBS_URL = `${API_URL}/jobs/`

    updateJob(jobTitle, employer, id, job) {
        return axios.put(`${GET_ALL_JOBS_URL}${id}`, job);
    }
    createJob(job) {
        return axios.post(`${GET_ALL_JOBS_URL}`, job);
    }

JobController

@Autowired
    private JobService jobService;

@PostMapping("/jobs/")
    public ResponseEntity<Job> createJob(@RequestBody Job job) {
        Job createdJob = jobService.createJob(job);
        java.net.URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(createdJob.getId())
                .toUri();
        return ResponseEntity.created(uri).build();
    }

    @PutMapping("/jobs/{id}")
    public ResponseEntity<Job> updateJob(@PathVariable long id, @RequestBody Job job) {
        job.setId(id);
        return ResponseEntity.ok().body(this.jobService.updateJob(job));
    }
// Other get and delete methods

JobService

public Job createJob(Job job) {
        if(job.getId() == -1 || job.getId() == 0) {
            job.setId(++idCounter);
            jobRepository.insert(job); 
        }
        return jobRepository.save(job);

    }

    public Job updateJob(Job job) {
        Optional < Job > jobDb = this.jobRepository.findById(job.getId());

        if (jobDb.isPresent()) {
            Job jobUpdate = jobDb.get();
            jobUpdate.setId(job.getId());
            jobUpdate.setEmployer(job.getEmployer());
            jobUpdate.setJobTitle(job.getJobTitle());
            jobUpdate.setDescription(job.getDescription());
            jobRepository.save(jobUpdate);
            return jobUpdate;
        } else {
            throw new ResourceNotFoundException("Record not found with id : " + job.getId());
        }
    }
// Other methods

Редактировать Полное сообщение об ошибке:

PUT http://localhost:8080/jobs/-1 500
dispatchXhrRequest  @   1.chunk.js:561
xhrAdapter  @   1.chunk.js:411
dispatchRequest @   1.chunk.js:994
Promise.then (async)        
request @   1.chunk.js:807
Axios.<computed>    @   1.chunk.js:831
wrap    @   1.chunk.js:1308
updateJob   @   main.chunk.js:1428
onSubmit    @   main.chunk.js:955
(anonymous) @   1.chunk.js:4699
(anonymous) @   1.chunk.js:5014
(anonymous) @   1.chunk.js:4709
Promise.then (async)        
(anonymous) @   1.chunk.js:4705
(anonymous) @   1.chunk.js:5014
(anonymous) @   1.chunk.js:4750
(anonymous) @   1.chunk.js:5014
callCallback    @   1.chunk.js:16321
invokeGuardedCallbackDev    @   1.chunk.js:16370
invokeGuardedCallback   @   1.chunk.js:16423
invokeGuardedCallbackAndCatchFirstError @   1.chunk.js:16438
executeDispatch @   1.chunk.js:16569
executeDispatchesInOrder    @   1.chunk.js:16594
executeDispatchesAndRelease @   1.chunk.js:16697
executeDispatchesAndReleaseTopLevel @   1.chunk.js:16706
forEachAccumulated  @   1.chunk.js:16678
runEventsInBatch    @   1.chunk.js:16723
runExtractedPluginEventsInBatch @   1.chunk.js:16865
handleTopLevel  @   1.chunk.js:21818
batchedEventUpdates$1   @   1.chunk.js:40326
batchedEventUpdates @   1.chunk.js:17401
dispatchEventForPluginEventSystem   @   1.chunk.js:21914
attemptToDispatchEvent  @   1.chunk.js:22031
dispatchEvent   @   1.chunk.js:21934
unstable_runWithPriority    @   1.chunk.js:51411
runWithPriority$2   @   1.chunk.js:28193
discreteUpdates$1   @   1.chunk.js:40343
discreteUpdates @   1.chunk.js:17426
dispatchDiscreteEvent   @   1.chunk.js:21901

1 Ответ

0 голосов
/ 24 марта 2020

Я просто добавил оператор if в методе updateJob, чтобы проверить, был ли идентификатор -1. Это далеко не красиво и нужно будет исправить снова, но пока сделаем. Спасибо за ваше время Code-Apprentice!

...