Я зіткнувся з тією ж проблемою і вирішив, що не хочу, щоб нульові перевірки шаблону gazillion були розкидані по моєму коду REST, тому ось це я вирішив зробити:
- Створіть анотацію, яка спричиняє появу винятку, коли необхідний параметр не вказано.
- Обробляти викинуте виняток так само, як я обробляю всі інші винятки, додані в мій код REST.
Для 1) я реалізував таку анотацію:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Required
{
}
... та наступний JAX-RS ContainerRequestFilter
для його застосування:
import java.lang.reflect.Parameter;
import javax.ws.rs.QueryParam;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.Provider;
@Provider
public class RequiredParameterFilter implements ContainerRequestFilter
{
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(ContainerRequestContext requestContext)
{
for (Parameter parameter : resourceInfo.getResourceMethod().getParameters())
{
QueryParam queryAnnotation = parameter.getAnnotation(QueryParam.class);
if (queryAnnotation != null && parameter.isAnnotationPresent(Required.class))
{
if (!requestContext.getUriInfo().getQueryParameters().containsKey(queryAnnotation.value()))
{
throw new YourCustomRuntimeException(queryAnnotation.value());
}
}
}
}
}
Вам потрібно зареєструвати ContainerRequestFilter
так само, як і інші ваші @Provider
класи у вашій бібліотеці JAX-RS. Можливо, RESTEasy робить це за вас автоматично.
Для 2) я обробляю всі винятки під час виконання, використовуючи загальний JAX-RS ExceptionMapper
:
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
@Provider
public class MyExceptionMapper implements ExceptionMapper<RuntimeException>
{
@Override
public Response toResponse(RuntimeException ex)
{
return Response
.status(Response.Status.BAD_REQUEST)
.entity(ex.toString())
.build();
}
}
Як і раніше, не забудьте зареєструвати клас у своїй бібліотеці JAX-RS.
@DefaultValue
анотацію та встановити відповідне значення параметра, коли він відсутній. Якщо у вас не може бути значення за замовчуванням, а параметр справді важливий, можливо, вам слід перевірити параметрnull
і повернути400 Bad request
код стану.