2010-08-06 12 views
10

में जेएक्सबीएलमेंट की पुष्टि करें मेरे पास जेएक्स-आरएस webservice (जर्सी) है जो जेपीए (एक्लिप्ससेंक) इकाइयों के लिए एक सीआरयूडी इंटरफ़ेस है। मेरी संस्थाओं को डेटाबेस टेबल से स्वत: उत्पन्न किया गया था और मैंने उन्हें जेएक्सबी एनोटेशन के साथ एनोटेट किया है ताकि उन्हें एक्सएमएल से/marmaralled/unmarshalled किया जा सके। मेरी संसाधन विधियां JAXBElement ऑब्जेक्ट्स को पैरामीटर के रूप में लेती हैं जहां आवश्यक हो।जेपीए/जेएक्स-आरएस वेब सेवा

मेरे पास एक्सएसडी नहीं है, हालांकि, मैं अनुरोधों में प्राप्त XML को सत्यापित करने के लिए एक लिखने को तैयार हूं। लेकिन, मुझे नहीं पता कि सत्यापन कैसे शुरू करें। जर्सी स्वचालित रूप से marshalling/unmarshalling को संभालने जा रहा है और सत्यापन के बारे में पाया गया कोई भी संदर्भ उस स्तर पर किया जाता है।

क्या किसी को एक उदाहरण/ट्यूटोरियल पता है जो यह दिखाता है कि यह कैसे करें?

धन्यवाद!

उत्तर

15

आप एक कस्टम संदेशबॉडी रीडर बनाकर इसे संभाल सकते हैं। उदाहरण के नीचे एक ग्राहक मॉडल पर आधारित है:

import java.io.IOException; 
import java.io.InputStream; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.Type; 
import java.net.URL; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.ext.ContextResolver; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.Provider; 
import javax.ws.rs.ext.Providers; 
import javax.xml.XMLConstants; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 

@Provider 
@Consumes("application/xml") 
public class ValidatingReader implements MessageBodyReader<Customer> { 

    @Context 
    protected Providers providers; 

    private Schema schema; 

    public ValidatingReader() { 
     try { 
      SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
      URL schemaURL = null; 
      schema = sf.newSchema(schemaURL); 
     } catch(Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2, MediaType arg3) { 
     return arg0 == Customer.class; 
    } 

    public Customer readFrom(Class<Customer> arg0, Type arg1, Annotation[] arg2, MediaType arg3, MultivaluedMap<String, String> arg4, InputStream arg5) 
      throws IOException, WebApplicationException { 
     try { 
      JAXBContext jaxbContext = null; 
      ContextResolver<JAXBContext> resolver = providers.getContextResolver(JAXBContext.class, arg3); 
      if(null != resolver) { 
       jaxbContext = resolver.getContext(arg0); 
      } 
      if(null == jaxbContext) { 
       jaxbContext = JAXBContext.newInstance(arg0); 
      } 
      Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
      unmarshaller.setSchema(schema); 
      return (Customer) unmarshaller.unmarshal(arg5); 
     } catch(JAXBException e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 
+0

अंत में मुझे एक स्कीमा के खिलाफ सत्यापन करने की आवश्यकता नहीं थी, लेकिन अगर मुझे भविष्य में आवश्यकता हो तो यह एक महान संदर्भ जानकारी है। – sdoca

9

हम एक कदम आगे जाने के लिए और एक सामान्य (सार) ValidatingReader के रूप में और जरूरत पड़ने पर जो उप वर्गीकृत किया जा सकता है बना सकते हैं। यह है कि मैं क्या ब्लेज से विचार करने के लिए किया है, धन्यवाद है:

import java.io.IOException; 
import java.io.InputStream; 
import java.lang.annotation.Annotation; 
import java.lang.reflect.ParameterizedType; 
import java.lang.reflect.Type; 

import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.MultivaluedMap; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ContextResolver; 
import javax.ws.rs.ext.MessageBodyReader; 
import javax.ws.rs.ext.Providers; 
import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 

public abstract class AbstractValidatingReader<T> implements 
    MessageBodyReader<T> { 

@Context 
protected Providers providers; 

@SuppressWarnings("unchecked") 
@Override 
public boolean isReadable(Class<?> arg0, Type arg1, Annotation[] arg2, 
     MediaType arg3) { 

    Class<T> readableClass = (Class<T>) ((ParameterizedType) getClass() 
      .getGenericSuperclass()).getActualTypeArguments()[0]; 
    return arg0 == readableClass; 
} 

@SuppressWarnings("unchecked") 
@Override 
public T readFrom(Class<T> arg0, Type arg1, Annotation[] arg2, 
     MediaType arg3, MultivaluedMap<String, String> arg4, 
     InputStream arg5) throws IOException, WebApplicationException { 

    T type = null; 
    JAXBContext jaxbContext = null; 
    ContextResolver<JAXBContext> resolver = providers.getContextResolver(
      JAXBContext.class, arg3); 
    try { 

     if (resolver != null) { 
      jaxbContext = resolver.getContext(arg0); 
     } 

     if (jaxbContext == null) { 
      jaxbContext = JAXBContext.newInstance(arg0); 

     } 
     type = (T) jaxbContext.createUnmarshaller().unmarshal(arg5); 
     validate(type); 

    } catch (JAXBException e) { 
     throw new WebApplicationException(
       Response.Status.INTERNAL_SERVER_ERROR); 
    } 

    return type; 
} 

protected abstract void validate(T arg0) throws WebApplicationException; 
} 

अवहेलना सत्यापित करें विधि और @Provider साथ उप-वर्ग व्याख्या और हम काम हो गया।

+0

हैलो, इसके लिए धन्यवाद। क्या आप यहां किसी संबंधित प्रश्न का उत्तर दे सकते हैं: http: //stackoverflow.com/questions/12530155/jax-rs-request- validation-using-xsd-jaxb – adi

+0

मुझे कुछ याद आना चाहिए - यह वर्ग वास्तव में कोई भी नहीं करता है सत्यापन? –

+0

@ डीजय यह कुछ समय पहले था और मैं अब भी एक ही स्थान पर काम नहीं करता हूं। लेकिन वास्तव में, अमूर्त वर्ग सत्यापन नहीं करता है। यह सिर्फ प्रकार बनाता है और सत्यापन उप वर्ग में किया जाता है। स्पष्ट रूप से इसे अभी देखकर, मैं कल्पना कर सकता हूं कि अमूर्त सुपर क्लास को स्कीमा सेट करने के लिए tweaking और इसके साथ unmarshalling भी कर सकते हैं। यह सब आपकी जरूरतों पर निर्भर करता है। – GWTNewbie