मैं एक ही समस्या में पड़ गए और फैसला किया है कि मैं एक gazillion बॉयलरप्लेट अशक्त मेरी बाकी कोड में फैले चेकों नहीं करना चाहता था, तो यह यह है मैं क्या करने का फैसला किया क्या:
- एक एनोटेशन है कि एक का कारण बनता है बनाएं एक आवश्यक पैरामीटर निर्दिष्ट नहीं होने पर अपवाद को अपवादित किया जाना चाहिए।
- फेंक दिया अपवाद संभाल लें वैसे ही मैं अपने आरईएसटी कोड में फेंकने वाले सभी अन्य अपवादों को संभालता हूं।
लिए 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
{
// This is just a marker annotation, so nothing in here.
}
... और निम्नलिखित JAX-आरएस 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)
{
// Loop through each parameter
for (Parameter parameter : resourceInfo.getResourceMethod().getParameters())
{
// Check is this parameter is a query parameter
QueryParam queryAnnotation = parameter.getAnnotation(QueryParam.class);
// ... and whether it is a required one
if (queryAnnotation != null && parameter.isAnnotationPresent(Required.class))
{
// ... and whether it was not specified
if (!requestContext.getUriInfo().getQueryParameters().containsKey(queryAnnotation.value()))
{
// We pass the query variable name to the constructor so that the exception can generate a meaningful error message
throw new YourCustomRuntimeException(queryAnnotation.value());
}
}
}
}
}
आप रजिस्टर करने की आवश्यकता ContainerRequestFilter
उसी तरह आप अपने JAX-RS लाइब्रेरी के साथ अन्य @Provider
कक्षाएं पंजीकृत करेंगे। शायद रीस्टेसी आपके लिए स्वचालित रूप से करता है।
लिए 2), मैं एक सामान्य JAX-आरएस 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)
{
// In this example, we just return the .toString() of the exception.
// You might want to wrap this in a JSON structure if this is a JSON API, for example.
return Response
.status(Response.Status.BAD_REQUEST)
.entity(ex.toString())
.build();
}
}
पहले की तरह, अपने JAX-आरएस पुस्तकालय के साथ वर्ग रजिस्टर करने के लिए याद है।
आप एक '@ DefaultValue' टिप्पणी जोड़ने और एक उचित मूल्य जब भी यह याद आ रही है करने के लिए पैरामीटर सेट कर सकते हैं। यदि आपके पास डिफ़ॉल्ट मान नहीं है और पैरामीटर वास्तव में महत्वपूर्ण है, तो शायद आपको 'शून्य' के लिए param जांचना चाहिए और '400 खराब अनुरोध 'स्थिति कोड वापस करना चाहिए। – toniedzwiedz