Spring @RequestBody из интерфейса
У меня есть классы, созданные из файла.raml. В сгенерированном интерфейсе для контроллера у меня есть @RequestBody по моему параметру. Если я пытаюсь сделать запрос, отображение работает корректно, но каждый раз, когда в моем объекте есть нулевые поля, помеченные @RequestBody из параметров. Похоже, эта аннотация игнорируется. Как я могу заставить это работать от интерфейса.
Для тестирования без Raml я попытался создать простой интерфейс для контроллера с простой реализацией, и я все еще получаю значения пустых полей в моем объекте запроса.
Интерфейс контроллера, сгенерированный из.raml
@RestController
@RequestMapping("/kbm")
public interface KbmController {
@RequestMapping(value = "", method = RequestMethod.PUT)
public ResponseEntity<KbmCalcResponse> updateKbm(
@Valid
@RequestBody
KbmCalcRequest kbmCalcRequest);
}
Моя реализация
@Component
@RequiredArgsConstructor
public class CalcKbmControllerImpl implements KbmController {
private final KbmService kbmService;
@Override
public ResponseEntity<KbmCalcResponse> updateKbm(KbmCalcRequest kbmCalcRequest) {
System.out.println(kbmCalcRequest.getInsurerID());
return ResponseEntity.ok(kbmService.calculate(kbmCalcRequest));
}
}
Модель запроса, сгенерированная из.raml
public class KbmCalcRequest implements Serializable
{
final static long serialVersionUID = 1692733266431420440L;
private String insurerID;
public KbmCalcRequest() {
super();
}
public KbmCalcRequest(String insurerID {
super();
this.insurerID = insurerID;
}
public String getInsurerID() {
return insurerID;
}
public void setInsurerID(String insurerID) {
this.insurerID = insurerID;
}
public int hashCode() {
return new HashCodeBuilder().append(insurerID).toHashCode();
}
public boolean equals(Object other) {
if (other == null) {
return false;
}
if (other == this) {
return true;
}
if (this.getClass()!= other.getClass()) {
return false;
}
KbmCalcRequest otherObject = ((KbmCalcRequest) other);
return new EqualsBuilder().append(insurerID, otherObject.insurerID).isEquals();
}
public String toString() {
return new ToStringBuilder(this).append("insurerID", insurerID).toString();
}
}
1 ответ
Проблема была в пружине багажника стартера. Мы использовали старую версию spring-boot-starter-parent - 2.0.1.RELEASE, которая использовала весеннюю сеть 4.3.5. Но особенность наследования аннотаций от параметров метода к реализациям этих методов была добавлена в 5.1.0. ПОЛУЧЕНИЕ весенней паутины. Итак, я только что поместил последнюю версию (2.1.5.RELEASE на данный момент) в мой файл pom, и это решило мою проблему.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>