簡體   English   中英

除非我在正文中提供 ID,否則 PUT 請求不會通過 go

[英]PUT request wont go through unless I provide ID in body

我在 url 中使用路徑變量來更新我的 object。 如果我已經在 url 中獲得它,我如何修改我的代碼以使其工作而無需在帖子正文中提供 id?

    public class Person {
        
        private String name;
        private UUID id;
        
        public(UUID id, String name) {
            this.id = id;
            this.name = name;
        }
        ...getters
    } 

服務 class

public int updatePerson(UUID id, Person person) {
        String sql = "UPDATE person SET name = ? WHERE id = ?";
        return jdbcTemplate.update(sql, person.getName(), person.getId());
    }

Controller

 @PutMapping("/{id}")
    public int updatePerson(@PathVariable UUID id, @RequestBody Person person) {
        return personService.updatePerson(id, person);
    }

只需將您的服務 class 更改為使用id而不是person.getId()

public int updatePerson(UUID id, Person person) {
    String sql = "UPDATE person SET name = ? WHERE id = ?";
    return jdbcTemplate.update(sql, person.getName(), id);
}

如果我理解您的問題,您希望使用Person作為有效負載模板來更新該 class 的實例。

您可以利用 JsonIgnore 注釋。

public class Person {
    
    private String name;

    @JsonProperty(access = Access.WRITE_ONLY)
    private UUID id;
    
    public(UUID id, String name) {
        this.id = id;
        this.name = name;
    }
    ...getters
} 

理想情況下,您將使用路徑變量來定位存儲在數據庫中的信息。 例如考慮:

@PostMapping("/{id}")
public ResponseEntity<int> updatePerson(@PathVariable UUID id, @RequestBody Person person) {
  Person alreadyExistingPerson = personService.getPersonById(id);
  if (alreadyExistingPerson == null) {
    return ResponseEntity.notFound().build();
  }

  // Then, update the information you already have for Person with the new provided
  // See this related SO question for options:
  // https://stackoverflow.com/questions/65367995/copy-changed-fields-into-an-object-in-java/65369332#65369332
  // In a simple use case
  alreadyExistingPerson.setName(person.getName());

  return personService.updatePerson(alreadyExistingPerson);
}

代碼中鏈接的問題

您的服務將包括:

public int getPersonById(UUID id) {
  String sql = "SELECT id, name FROM person WHERE id = ?";
  // The queryForObject method has a lot of overloads, use the one you consider appropriate
  return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) ->
    new Person(
      UUID.fromString(rs.getString("id")),
      rs.getString("name")
    )
  );
}

public int updatePerson(Person person) {
  String sql = "UPDATE person SET name = ? WHERE id = ?";
  return jdbcTemplate.update(sql, person.getName(), person.getId());
}

在更新信息時,最好使用POST HTTP 方法而不是PUT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM