Spring Controller создает исключение NullPointerException при передаче целочисленных данных с помощью Ajax / Post - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь передать набор данных в html-форме;

<form class="form-inline" id="createjobform" method="POST" th:action="@{/createJob}">
...
<div class="form-group">
    <input type="text" class="form-control" id="nopth"
    placeholder="Number Of People To Hire" name="nopth" />
</div>
<div class="form-group">
    <input type="text" readonly="readonly" class="form-control"
    id="listid" placeholder="ID" name="listid"
    title="ID of the list which associated" 
    th:value="${findOneList.id}"/>
</div>

listid здесь, из другой таблицы (manytoone-onetomany), и я хочу добавить новую запись с этим listid.Когда я делаю это на phpmyadmin, это работает.Но я хочу сделать это с AJAX или без AJAX, на самом деле.Я пробовал оба пути, но он показывает ту же ошибку.

Вот мой контроллер;

@RequestMapping(value = "/createJob", method = RequestMethod.POST)
public @ResponseBody void createJob(@RequestBody Jobs jobs,
        @RequestParam(value = "title", required = false) String title,
        @RequestParam(value = "description", required = false) String description,
        @RequestParam(value = "nopth", required = false) Integer nopth,
        @RequestParam(value = "lastDate", required = false) Date lastDate,
        @RequestParam(value = "listid", required = false) Long listid,
        HttpServletResponse hsr) throws IOException {

    // if I do String nopth above and then
    //jobs.setNopth(Integer.valueOf(nopth));
    // error is NumberFormatException (cannot cast string to int)

    jobs.setLastDate(lastDate);
    jobs.setTitle(title);
    jobs.setDescription(description);
    jobs.setNopth(nopth);
    Lists listttt = listsService.findOne(listid);
    jobs.setLists(listttt);

    jobsService.save(jobs);
    mavHomepage.addObject("findOneList", listsService.findOne(jobs.getId()));
    mavHomepage.addObject("mod", "VIEW_ONELIST");
    hsr.sendRedirect("/oneList?id=" + listid);
}

, поэтому ошибка;

error: "Internal Server Error"
exception: "java.lang.NullPointerException"
message: "No message available"
path: "/createJob"
status: 500

в строке jobs.setNopth (nopth);

также ошибка;

error: "Internal Server Error"
exception: "org.springframework.dao.InvalidDataAccessApiUsageException"
message: "The given id must not be null!; nested exception is 
java.lang.IllegalArgumentException: The given id must not be null!"
path: "/createJob"
status: 500

в строке Lists listttt = listsService.findOne (listid);

Это не для ajax / post.Когда я делаю;

public @ResponseBody void createJob(@RequestBody Jobs jobs,
    @RequestParam(value="listid, required="false") listid,
    HttpServletResponse hsr){

        Lists listttt = listsService.findOne(listid);
        jobs.setLists(listttt);
         ...
}

и ajax;

var formData = {
    title : $("#title").val(),
    description : $("#description").val(),
    nopth : $("#nopth").val(),
    lastDate : $("#lastDate").val(),
    listid : $("#listid").val(),
}
...
$.ajax({
        type : "POST",
        contentType : "application/json",
        url : "/createJob",
        data : JSON.stringify(formData),
....

та же ошибка (указанный идентификатор не должен быть нулевым!)

ТАК, КАК ДОЛЖЕН ЯПРОЙДИТЕ ДАННЫЕ ИЗ ФОРМЫ, ЧТО ТАКОЕ ЦЕЛОЕ / ДЛИННЫЕ ЦЕННОСТИ?С AJAX БЫ ЛУЧШЕ.И этот список - ИНОСТРАННЫЙ КЛЮЧ.

Классы моделей;

@Entity(name = "jobs")
public class Jobs {

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

@Column(name = "Title")
private String title;

@Column(name = "Description")
private String description;

@Column(name = "Number_Of_People_To_Hire")
private Integer nopth;

@Column(name = "Last_Application_Date")
private Date lastDate;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="listid")
private Lists lists;

...

@Entity(name = "lists")
public class Lists implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;

@Column(name = "List_Name")
public String listname;

@OneToMany(mappedBy = "lists", cascade = CascadeType.ALL)
private List<Jobs> jobs;

Я пытался изменить тип nopth наСтрока, целое число и т. Д. И тип ввода = "текст или число" без изменений.

1 Ответ

0 голосов
/ 24 марта 2019
  • @RequestBody Эта аннотация указывает, что параметр метода должен быть привязан к телу веб-запроса
  • Таким образом, вы должны исправить свой контроллер следующим образом:

    @RequestMapping(value = "/createJob", method = RequestMethod.POST)
    @ResponseBody
    public void createJob(
        @RequestBody Jobs jobs,
        @RequestParam("listid") Long listid
        HttpServletResponse hsr) throws IOException {
    
       Lists listttt = listsService.findOne(listid);
       jobs.setLists(listttt);
    
       jobsService.save(jobs);
    
       ...
    
    }
    
  • Ваш запрос jquery:

    var formData = {
        title : $("#title").val(),
        description : $("#description").val(),
        nopth : $("#nopth").val(),
        lastDate : $("#lastDate").val()
    }
    
    var listid : $("#listid").val(),
    
    var settings = {
      "url": "http://localhost:8080/createJob?listid="+listid,
      "method": "POST",
      "data": JSON.stringify(formData)
      "headers": {
        "Content-Type": "application/json"
      }
     }
    
     $.ajax(settings).done(function (response) {
       console.log(response);
     });
    
...