#java #rest #spring-mvc #path-parameter
#java #rest #spring-mvc #path-параметр
Вопрос:
Мой вопрос в том, как я могу проверить параметры запроса, если я использую @PathParam.
Например, у меня есть два параметра запроса, name и id
path is localhost:/.../search/namevalue/idvalue
если пользователь отправляет пробелы для имени или идентификатора, я должен отправить ответ, в котором указано, что требуется имя / идентификатор.
Я мог бы выполнить проверки, если бы использовал @QueryParam, но я не уверен, как это сделать, если мне нужно использовать переменные пути.
Если я просто протестирую, используя http:/localhost:/.../search/namevalue
или http:/localhost:/.../search/idvalue
или http:/localhost:/.../search/
, это вызовет исключение сервлета.
Ниже приведен код, если я использую параметры запроса, проверки работают просто отлично, пожалуйста, дайте мне знать о подходе, когда я использую параметр пути
@Controller
@Path("/customer")
public class CustomerController extends BaseController implements Customer {
@Override
@GET
@Produces({ "application/json", "application/xml" })
@Path("/search/{name}/{id}/")
public Response searchCustomerDetails(
@PathParam("name") String name,
@PathParam("id") Integer id) {
ResponseBuilder response = null;
CustomerValidations validations = (CustomerValidations) getAppContext()
.getBean(CustomerValidations.class);
CustomerResponse customerResponse = new CustomerResponse();
CustomerService customerService = (CustomerService) getAppContext()
.getBean(CustomerService.class);
try {
validations.searchCustomerDetailsValidation(
name, id,customerResponse);
if (customerResponse.getErrors().size() == 0) {
CustomerDetails details = customerService
.searchCustomerDetailsService(name, id);
if (details == null) {
response = Response.status(Response.Status.NO_CONTENT);
} else {
customerResponse.setCustomerDetails(details);
response = Response.status(Response.Status.OK).entity(
customerResponse);
}
} else {
response = Response.status(Response.Status.BAD_REQUEST).entity(
customerResponse);
}
}
catch (Exception e) {
LOGGER.error(e.getMessage());
response = Response.status(Response.Status.INTERNAL_SERVER_ERROR);
}
return response.build();
} }
@Component
@Scope("prototype")
public class CustomerValidations {
public void searchCustomerDetailsValidation(
String name, Integer id,
CustomerResponse customerResponse) {
if (id == null) {
customerResponse.getErrors().add(
new ValidationError("BAD_REQUEST",
""invalid id));
}
if (name== null
|| (name!= null amp;amp; name
.trim().length() == 0)) {
customerResponse.getErrors().add(
new ValidationError("BAD_REQUEST", "invalid id"));
}
} }
@XmlRootElement
public class CustomerResponse {
private CustomerDetails customerDetails;
private List<ValidationError> errors = new ArrayList<ValidationError>();
//setters and getters }
public class ValidationError {
private String status;
private String message;
public ValidationError() {
}
public ValidationError(String status, String message) {
super();
this.status = status;
this.message = message;
}
//setters and getters }
Комментарии:
1. Пожалуйста, добавьте свой код и трассировку стека.
Ответ №1:
Вы получаете исключение, потому что у вас нет методов, сопоставленных с @Path("/search/{foo}/")
или @Path("/search/")
, поэтому вы должны получать ответ 404 по умолчанию, поскольку эти пути на самом деле не определены.
Я не уверен, почему вы хотели бы проверить эти «отсутствующие» пути запроса, хотя — похоже, что эта конечная точка предназначена для использования в качестве конечной точки запроса, поэтому я бы посоветовал вам использовать @RequestParam
/ параметры запроса для более точного описания поиска, который вы пытаетесь выполнить. Путь search/{name}/{id}
предполагает конкретный ресурс, который постоянно находится по этому URL, хотя в этом случае вы запрашиваете клиентов на этом контроллере.
Я бы предложил вам полностью удалить /search
путь и просто сопоставить параметры запроса с «root» клиентского контроллера, чтобы вы получили что-то вроде
@Controller
@Path("/customer")
public class CustomerController extends BaseController implements Customer {
@GET
@Produces({"application/json", "application/xml"})
public Response searchCustomerDetails(
@RequestParam("name") String name,
@RequestParam("id") Integer id) {
// Returns response with list of links to /customer/{id} (below)
}
@GET
@Produces({"application/json", "application/xml"})
@Path("/{id}")
public Response getCustomerDetails(@PathVariable("id") String id) {
// GET for specific Customer
}
}