I created a custom responseModel to have a standard json responseModel for some of my different RestController.
Superclass TransactionResponseModel:
public class TransactionResponseModel {
private HttpStatus httpStatus;
private Double amount;
private String transactionId;
private String message;
public SvsTransactionResponseModel() {
super();
}
public SvsTransactionResponseModel(HttpStatus httpStatus, String message) {
super();
this.httpStatus = httpStatus;
this.message = message;
}
//public getter/setter
}
Class BalanceInquiryResponseModel:
public class BalanceInquiryResponseModel extends SvsTransactionResponseModel {
private final BalanceInquiryResponse balanceInquiryResponse;
public BalanceInquiryResponseModel(BalanceInquiryResponse balanceInquiryResponse) {
super();
this.balanceInquiryResponse = balanceInquiryResponse;
if (this.balanceInquiryResponse != null && this.balanceInquiryResponse.getBalanceInquiryReturn() != null) {
setAmount(this.balanceInquiryResponse);
setMessage(this.balanceInquiryResponse);
setTransactionId(this.balanceInquiryResponse);
setHttpStatus();
}
}
private void setAmount(BalanceInquiryResponse balanceInquiryResponse) {
if (balanceInquiryResponse.getBalanceInquiryReturn().getBalanceAmount() != null) {
setAmount(balanceInquiryResponse.getBalanceInquiryReturn().getBalanceAmount().getAmount());
}
}
private void setTransactionId(BalanceInquiryResponse balanceInquiryResponse) {
setTransactionId(balanceInquiryResponse.getBalanceInquiryReturn().getTransactionID());
}
private void setMessage(BalanceInquiryResponse balanceInquiryResponse) {
if (balanceInquiryResponse.getBalanceInquiryReturn().getReturnCode() != null) {
setMessage(balanceInquiryResponse.getBalanceInquiryReturn().getReturnCode().getReturnDescription());
}
}
private void setHttpStatus() {
setHttpStatus(HttpStatus.OK);
}
}
The BalanceInquiryResponseModel expects a BalanceInquiryResponse Object for setting different attributes. Nearly all attributes for my BalanceInquiryResponseModel are coming from a thiry-party Object BalanceInquiryResponse. This third-party object has to many information and because of that I dont want to response this object to the caller but set instead all the necessary attributes manually.
In my Controller I just return a ResponseEntity<? extends SvsTransactionResponseModel>.
@PostMapping(value = "/balanceInquiry")
public ResponseEntity<TransactionResponseModel> getBalanceInquiry(
@Valid @RequestBody BalanceInquiryModel balanceInquiry, Errors errors) {
if (errors.hasErrors()) {
return new ResponseEntity<>(
new TransactionResponseModel(HttpStatus.BAD_REQUEST, errors.getAllErrors().toString()),
HttpStatus.BAD_REQUEST);
}
BalanceInquiryResponse balanceInquiryResponse = null;
//logic to get the balanceInquiryResponse.
return new ResponseEntity<>(new BalanceInquiryResponseModel(balanceInquiryResponse), HttpStatus.OK);
}
For other controllers I will have the other responseModels extending TransactionResponseModel.
Is this a good approach for a custom responseModel?
Tech-Stack:
spring-boot
privatewithprotected. If you or someone else later wants to extendTransactionResponseModelorBalanceInquiryResponseModelthenprivatecan really start to hurt. The amount of times I wished for something to beprotectedinstead ofprivateis beyond counting. \$\endgroup\$