Как проверить переменные пути в REST

#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
    }
}