我有从.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();
}
}
答案 0 :(得分:1)
问题出在spring boot启动器中。我们使用了spring-boot-starter-parent-2.0.1.RELEASE的旧版本,该版本采用了spring web 4.3.5。但是在Spring Web的5.1.0.RELEASE中增加了从方法的参数继承注释到这些方法的实现的功能。因此,我将最新版本(目前为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>