Ich stieß auf dasselbe Problem und entschied, dass ich keine millionenfachen Nullprüfungen auf meinem REST-Code haben wollte. Deshalb habe ich mich dazu entschlossen:
- Erstellen Sie eine Anmerkung, die bewirkt, dass eine Ausnahme ausgelöst wird, wenn kein erforderlicher Parameter angegeben wird.
- Behandeln Sie die ausgelöste Ausnahme genauso wie alle anderen in meinem REST-Code ausgelösten Ausnahmen.
Für 1) habe ich die folgende Anmerkung implementiert:
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
{
}
... und das folgende JAX-RS ContainerRequestFilter
, um es durchzusetzen:
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());
}
}
}
}
}
Sie müssen ContainerRequestFilter
das genauso registrieren, wie Sie Ihre anderen @Provider
Klassen bei Ihrer JAX-RS-Bibliothek registrieren würden . Vielleicht erledigt RESTEasy das automatisch für Sie.
Für 2) behandle ich alle Laufzeitausnahmen mit einem generischen 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();
}
}
Denken Sie nach wie vor daran, die Klasse bei Ihrer JAX-RS-Bibliothek zu registrieren.
@DefaultValue
Anmerkung hinzufügen und den Parameter auf einen geeigneten Wert setzen, wenn er fehlt. Wenn Sie keinen Standardwert haben können und der Parameter wirklich wichtig ist, sollten Sie den Parameter möglicherweise überprüfennull
und einen400 Bad request
Statuscode zurückgeben.