Skip to content
Advertisement

How to send headers from controller into another class in Java

I have a controller like below

SubmitBatchController.java

@RestController
@RequestMapping({"/"})
@Api(value = "batch", tags = {"Batch "}, authorizations = {@Authorization(value="JwtToken")})
public class SubmitBatchController extends BasicController {

@PostMapping(value = "v1/batch", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CommonResponse<BatchSubmissionResponseModel> submitBatchClaim(
@ApiParam(hidden = true) @RequestHeader(required = false) String transId,
@ApiParam(hidden = true) @RequestHeader(required = false) String paymentReleaseInd,
@ApiParam(hidden = true) @RequestHeader(required = false) String emailMatchedInd,
@ApiParam(hidden = true) @RequestHeader(vrequired = false) String role,
@RequestBody BatchSubmissionRequestModel batchSubmissionRequestModel,
BindingResult br, HttpServletRequest request, HttpServletResponse response) throws Exception {

LocalDateTime startLocaleDateTime = LocalDateTime.now();
BatchSubmissionResponseModel batchSubmissionResponseModel = new BatchSubmissionResponseModel();
ContextBase ctxBase = getChainBaseContext(request);
ctxBase.put(PARAM_LOC.RESPONSE, batchSubmissionResponseModel);
HeaderRequestModel headers = new headerRequestModel();  
batchSubmissionRequestModel.setTransId(transId);    
headers.setRole(role);
headers.setPaymentReleaseInd(paymentReleaseInd);
headers.setEmailMatchedInd(emailMatchedInd);

batchSubmissionRequestModel.setHeaderRequestModel(headers);
}
} 

       

BatchSubmissionRequestModel.java

public class BatchSubmissionRequestModel {

@ApiModelProperty(hidden = true) // this is captured as a header and set in the controller
@NotBlank(message = "Headers.transId.NotBlank")
private String transId;
@ApiModelProperty(hidden = true)
private HeaderRequestModel headerRequestModel;

public String getTransId() {
return transId;
}
public void setTransId(String transId) {
this.transId = transId;
}
public HeaderRequestModel getHeaderRequestModel() {
return headerRequestModel;
}
public void setHeaderRequestModel(HeaderRequestModel headerRequestModel) {
this.headerRequestModel= headerRequestModel;
}
}

HeaderRequestModel.java

public class HeaderRequestModel {     
    private String paymentReleaseInd;
    private String emailMatchedInd;
    private String role;
    public String getPaymentReleaseInd() {
        return paymentReleaseInd;
    }
    public void setPaymentReleaseInd(String paymentReleaseInd) {
        this.paymentReleaseInd = paymentReleaseInd;
    }
    public String getEmailMatchedInd() {
        return emailMatchedInd;
    }
    public void setEmailMatchedInd(String emailMatchedInd) {
        this.emailMatchedInd = emailMatchedInd;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
}

Now I have another class, which has to take the headers from SubmitBatchController.java & set it into FullEligibilityService.java

FullEligibilityRequestModel.java

public class FullEligibilityRequestModel{
private String transId;
private HeaderRequestModel headerRequestModel;

public String getTransId() {
return transId;
}
public void setTransId(String transId) {
this.transId = transId;
}

public DapHeaderRequestModel getDapHeaderRequestModel() {
return dapHeaderRequestModel;
}
public void setDapHeaderRequestModel(DapHeaderRequestModel dapHeaderRequestModel) {
this.dapHeaderRequestModel = dapHeaderRequestModel;
}
}

FullEligibilityService.java

(request is mapped to FullEligibilityRequestModel)

@Service
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class FullEligibilityServiceextends extends AServiceTask <FullEligibilityRequestModel, FullEligibilityResponseModel>{

private static final String HEADER_FULL_ELIGIBILITY_TRANS_ID = "transId";
private static final String HEADER_PAYMENT_RELEASE_INDICAATOR =  "paymentReleaseInd"; 
private static final String HEADER_EMAIL_MATCHED_INDICATOR = "emailMatchedInd";
private static final String HEADER_ROLE = "role";

@Override
protected void processTask() {
try {

Map<String, String> headers = new HashMap<String, String>();
headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
headers.put(HEADER_FULL_ELIGIBILITY_TRANS_ID, request.getTransId());
headers.put(HEADER_PAYMENT_RELEASE_INDICAATOR, request.getHeaderRequestModel().getPaymentReleaseInd()); // getting NULL
headers.put(HEADER_EMAIL_MATCHED_INDICATOR, request.getHeaderRequestModel().getEmailMatchedInd()); // getting NULL
headers.put(HEADER_DAP_ROLE, request.getHeaderRequestModel().getRole()); // getting NULL
.....
}
catch (Exception e) {
LOGGER.error("FullEligibilityService.processTask call failed");
exception = e;
status = STATUS_TASK_EXCEPTION;
e.printStackTrace();
}
}

I’m not able to get the headers set in SubmitBatchController.java into FullEligibilityService.java, due to which I get null values.

Can someone help me how to set the PaymentReleaseInd, EmailMatchedInd, HeaderRequestModel set in SubmitBatchController.java into FullEligibilityService.java

Advertisement

Answer

You need to inject an instance of FullEligibilityService into SubmitBatchController as follows and then you just need to call the corresponding method with the required parameters:

@RestController
@RequestMapping({"/"})
@Api(value = "batch", tags = {"Batch "}, authorizations = {@Authorization(value="JwtToken")})
public class SubmitBatchController extends BasicController {

    @Autowired
    FullEligibilityService fullEligibilityService;

    @PostMapping(value = "v1/batch", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public CommonResponse<BatchSubmissionResponseModel> submitBatchClaim(
      @ApiParam(hidden = true) @RequestHeader(required = false) String transId,
      @ApiParam(hidden = true) @RequestHeader(required = false) String paymentReleaseInd,
      @ApiParam(hidden = true) @RequestHeader(required = false) String emailMatchedInd,
      @ApiParam(hidden = true) @RequestHeader(vrequired = false) String role,
      @RequestBody BatchSubmissionRequestModel batchSubmissionRequestModel,
      BindingResult br, HttpServletRequest request, HttpServletResponse response) throws Exception {

          LocalDateTime startLocaleDateTime = LocalDateTime.now();
          BatchSubmissionResponseModel batchSubmissionResponseModel = new BatchSubmissionResponseModel();
          ContextBase ctxBase = getChainBaseContext(request);
          ctxBase.put(PARAM_LOC.RESPONSE, batchSubmissionResponseModel);
          HeaderRequestModel headers = new headerRequestModel();  
          batchSubmissionRequestModel.setTransId(transId);    
          headers.setRole(role);
          headers.setPaymentReleaseInd(paymentReleaseInd);
          headers.setEmailMatchedInd(emailMatchedInd);

          fullEligibilityService.processTask(paymentReleaseInd, emailMatchedInd, headers);
    }

   (...)
}

You need to change Service to accept the data you need as follows:

@Service
public class FullEligibilityServiceextends extends AServiceTask <FullEligibilityRequestModel, FullEligibilityResponseModel>{

public void processTask(String paymentReleaseInd, String emailMatchedInd, HeaderRequestModel headers) {
    (...) //Whatever logic you want to implement
}

Right now you are trying to pass around the data you need via request headers which is definitely a bad practice.

Advertisement