I am generating the swagger docs for my REST API using SpringFox.
I have added an optional parameter to my API now:
#ApiOperation(
value = "Get all cars"
)
#GetMapping(value = "/cars", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseDTO<CarDTO>> getCars(
#RequestParam(defaultValue = "1") Integer page,
#RequestParam(required = false) String status) {
ResponseDTO<CarDTO> response = service.getCars(page, status);
return ResponseEntity.ok(response);
}
How do I highlight in the swagger docs that one is required and the other is optional?
You have the #ApiParam annotation you can use, it has a property required which you can put to true or false depending on your needs
#ApiOperation(
value = "Get all cars"
)
#GetMapping(value = "/cars", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseDTO<CarDTO>> getCars(
#ApiParam(required = true) #RequestParam(defaultValue = "1") Integer page,
#ApiParam(required = false) #RequestParam(required = false) String status) {
ResponseDTO<CarDTO> response = service.getCars(page, status);
return ResponseEntity.ok(response);
}
As you can see in the documentation, it has other properties like
access
allowableValues
allowMultiple
defaultValue
name
value
Related
I´m trying to make a request with or without parameters, according the code below:
#RequestMapping(value = "/threshold/list", method = RequestMethod.GET)
public List<Threshold> listThreshold(#RequestParam(required = false) String categoria, #RequestParam(required = false) String kpi, #RequestParam(required = false) String data, #RequestParam(required = false) String hora) {
return thresholdQuery.listThreshold(categoria, kpi, data, hora);
}
But when I call the endpoint this way:
http://localhost:8081/threshold/list?categoria=casa
I got the error below:
Not enough variable values available to expand 'categoria=casa'
I believe it should be 'name' instead of 'value'
#RequestParam(name="categoria",required = false)
I have the following code:
#PostMapping()
public ResponseEntity<Object> postAccounts(
#RequestHeader(value = "client-id", required = true) String clientId,
#RequestHeader(value = "X-client-Global-Id", required = false) String clientGlobalID,
#RequestHeader(value = "Authorization", required = true) String authorization,
#Valid #RequestBody(required = true) String inputContract, #RequestBody(required = true)String nameInput, #RequestBody(required = true) Boolean state) {
return new ResponseEntity<>(inputContract, HttpStatus.OK);
}
When call this method by postman give me an error.
trace": "org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Stream closed\r\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:217)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:158)\r\n\tat
You only can send an one RequestBody, if you want send more than one properties in the body. You must create an object
#PostMapping()
public ResponseEntity<Object> postAccounts(
//Other Headers...,
#Valid #RequestBody(required = true) ObjectWithAllFields) {
return new ResponseEntity<>(ObjectWithAllFields, HttpStatus.OK);
}
EDIT 1
And pls send your error trace.
I have spring code where there is request as follows :
#RequestMapping(method = RequestMethod.GET, value = {
EnterpriseLiterals.ROOT_URL_SIMPLE + "storeDepartments/search.json",
EnterpriseLiterals.ROOT_URL_SIMPLE + "storeDepartments/search" },params = { "!dealerStoreId" })
public Map<String, List<? extends AbstractDepartment>> getDepartments(
#RequestParam(value = "enterpriseId", required = true) String enterpriseId,#RequestParam(value = "responseFields", required = false) String responseFields)
And another request as :
#RequestMapping(method = RequestMethod.GET, value = {
EnterpriseLiterals.ROOT_URL_SIMPLE + "storeDepartments/search",
EnterpriseLiterals.ROOT_URL_SIMPLE + "storeDepartments/search.json" },params = {"!enterpriseId"})
#ResponseBody
public Map<String, List<AbstractDepartment>> getDepartmentListBasedOnStoreAndDeptType(#RequestParam(value = "dealerStoreId", required = true) String dealerStoreId,#RequestParam(value = "responseFields", required = false, defaultValue = "summary") String responseFields)
However, since there is responseFields in both the requests I am getting error when I call the above API's with responseFields saying "ResponseFields does not exist.".
Please help with solutions to solve this problem.
I'm new in Spring Boot and I want to have the same Request Mapping method for JSON and simple request params, for example:
#RequestMapping(value = "/start")
public String startPostProcess(#RequestParam(value = "url",
required = false,
defaultValue = "https://goo.gl") String url,
#RequestParam(value = "word",
required = false,
defaultValue = "Search") String word,
#RequestBody String hereGoesJSON) {
//Do some stuff
}
So, when request goes with params, only #RequestParam will work, in other cases we will use #RequestBody annotation.
localhost:8080/start?url=htts://google.com&word=Luck
Or may bee I'll be able to write method like this, for accepting any params:
#RequestMapping(value = "/start")
public String startPostProcess(#RequestBody String anyParam) {
//Parse this anyParam
}
?
I've not found this trick in spring documentation, so I will appreciate any links to it.
Okay, I've solved the problem :D
All that I just needed was 2 methods with the same mapping and explicitly specify RequestMethod type:
#RequestMapping(value = "/start")
public String startPostProcess(#RequestParam(value = "url",
required = false,
defaultValue = "https://goo.gl") String url,
#RequestParam(value = "word",
required = false,
defaultValue = "Search") String word) throws InterruptedException {
//Do some stuff
}
#RequestMapping(value = "/start", method = RequestMethod.POST, consumes = "application/json")
public String startJsonProcess(#RequestBody String body) {
//Do another stuff with RequestBody
}
UPD: added "consumes = "application/json". It helps dividing simple POST requests and JSON POST requests.
Facing issue while posting call to server side
Exception stack trace :
"org.springframework.web.bind.MissingServletRequestParameterException: Required int parameter 'answerId' is not present\r\n\tat org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseMissingParameterException(AnnotationMethodHandlerAdapter.java:773)\r\n\tat org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveRequestParam(HandlerMethodInvoker.java:509)
Javascript call in controller.js
$scope.saveCorrectAnswer = function(answerId) {
var answerIdVal = 0;
answerIdVal = answerId;
if(document.getElementById(answerId).className == 'ico-white-check') {
$scope.answer.correct = 'Y';
} else{
$scope.answer.correct = 'N';
}
Answer.update({answerId: answerIdVal, correct: $scope.answer.correct}, function(response) {
// On success go to Exchange
//$route.reload();
},
Mapping in service controller in java:
#RequestMapping(method = RequestMethod.PUT, consumes = "application/json", produces = "application/json")
#ResponseBody
public void addCorrectAnswer(#RequestParam int answerId, #RequestParam String correct) {
getAnswerDAC().addCorrectAnswer(answerId, correct);
}
#RequestParam has an attribute required which is true by default. If answerId is not required, change the annotation and parameter type as follows...
#RequestMapping(method = RequestMethod.PUT, consumes = "application/json", produces = "application/json")
#ResponseBody
public void addCorrectAnswer(#RequestParam(required = false) Integer answerId, #RequestParam String correct) {
getAnswerDAC().addCorrectAnswer(answerId, correct);
}
Edit: Since answerId is a primitive value in your example, you would also need to provide a defaultValue in the annotation. Providing a defaultValue implicitly sets required to false, so I'll leave it out of the example...
#RequestMapping(method = RequestMethod.PUT, consumes = "application/json", produces = "application/json")
#ResponseBody
public void addCorrectAnswer(#RequestParam(defaultValue = 0) int answerId, #RequestParam String correct) {
getAnswerDAC().addCorrectAnswer(answerId, correct);
}
Hope this helps