2011-09-27 18 views
5

के साथ जेबॉस रीस्टेसी जेएक्स-आरएस जेएक्सबी स्कीमा सत्यापन मैं जेबॉस एएस 7 के अंदर चल रहे किसी एप्लिकेशन में मेरे (अनुबंध पहले) आरईएसटी इंटरफ़ेस पर आने वाली सभी आने वाली एक्सएमएल फाइलों को सत्यापित करने की कोशिश कर रहा हूं। मैंने सुंदर के लिए @ डेकोरेटर लिखा है। प्रिंटिंग (जैसा कि जेबॉस रीस्टेसी डॉक्यूमेंटेशन में उदाहरण के अनुसार) और unmarshaller के लिए एक्सएमएल स्कीमा सत्यापन पर स्विच करने के लिए एक समान है। दुर्भाग्य से, unmarshaller के लिए सजावट कभी नहीं कहा जाता है।सजावट

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.xml.bind.Marshaller; 

import org.jboss.resteasy.annotations.Decorator; 

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Decorator(processor = PrettyProcessor.class, target = Marshaller.class) 
public @interface Pretty {} 

और कार्यान्वयन:

import java.lang.annotation.Annotation; 

import javax.ws.rs.core.MediaType; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.PropertyException; 

import org.apache.log4j.Logger; 
import org.jboss.resteasy.annotations.DecorateTypes; 
import org.jboss.resteasy.spi.interception.DecoratorProcessor; 

@DecorateTypes({ "text/*+xml", "application/*+xml", MediaType.APPLICATION_XML, MediaType.TEXT_XML }) 
public class PrettyProcessor implements DecoratorProcessor<Marshaller, Pretty> { 
    private static final Logger LOGGER = Logger.getLogger(PrettyProcessor.class); 

    @Override 
    public Marshaller decorate(Marshaller target, Pretty annotation, Class type, Annotation[] annotations, MediaType mediaType) { 
     LOGGER.debug("Pretty."); 
     try { 
      target.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     } catch (PropertyException e) { 
     } 
     return target; 
    } 
} 

अब मान्य के लिए एनोटेशन (वह काम नहीं करता)

यहाँ सुंदर डेकोरेटर के लिए कोड है:

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import javax.xml.bind.Unmarshaller; 

import org.jboss.resteasy.annotations.Decorator; 

@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Decorator(processor = ValidateProcessor.class, target = Unmarshaller.class) 
public @interface Validate {} 

कार्यान्वयन:

import java.lang.annotation.Annotation; 

import javax.ws.rs.core.MediaType; 
import javax.ws.rs.ext.Provider; 
import javax.xml.XMLConstants; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.PropertyException; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.transform.Source; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.validation.Schema; 
import javax.xml.validation.SchemaFactory; 

import org.apache.log4j.Logger; 
import org.jboss.resteasy.annotations.DecorateTypes; 
import org.jboss.resteasy.spi.interception.DecoratorProcessor; 
import org.xml.sax.SAXException; 

@DecorateTypes({ "text/*+xml", "application/*+xml", MediaType.APPLICATION_XML, MediaType.TEXT_XML }) 
public class ValidateProcessor implements DecoratorProcessor<Unmarshaller, Validate> { 
    private static final Logger LOGGER = Logger.getLogger(ValidateProcessor.class); 

    @Override 
    public Unmarshaller decorate(Unmarshaller target, Validate annotation, Class type, Annotation[] annotations, MediaType mediaType) { 
     target.setSchema(getSchema()); 
     LOGGER.debug("Set validation schema."); 
     System.out.println("Set validation schema."); 
     return target; 
    } 
} 

और बाकी इंटरफ़ेस का कोड:

import javax.annotation.security.RolesAllowed; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.Context; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.SecurityContext; 
import javax.xml.ws.WebServiceException; 

@Path("/{mdvt}/{ouid}/order") 
public interface OrderResource { 

    @RolesAllowed({ "mpa" }) 
    @POST 
    @Path("/update") 
    @Consumes({MediaType.APPLICATION_XML, MediaType.TEXT_XML}) 
    @Produces(MediaType.APPLICATION_XML) 
    @Pretty 
    public Response update(@Context SecurityContext sec, 
      @PathParam("ouid") String ouID, 
      @PathParam("mdvt") long masterDataVersionTag, 
      @Validate UpdateOrdersRequest uor) throws WebServiceException; 
} 

ही बाकी विधि पर, (अपडेट) @Pretty डेकोरेटर @Validate नहीं करता है जबकि कॉल किया जाता है। मुझसे यहां क्या गलत हो रहा है?

मुझे एक पुरानी बग Decorator for Jaxb unmarshaller doesn't work मिली है जो बंद है।

टिप्पणियां कहती हैं कि सब कुछ काम करता है, और उपरोक्त कोड समाधान से लगभग बिल्कुल ठीक है। फिर भी, Unmarshaller के लिए कुछ भी काम नहीं करता है।

उत्तर

2

अंत में इस समस्या के रूप में 7.

समस्या

JBoss के लिए हल किया गया था Resteasy कार्यान्वयन जो गाड़ी जब तक है में निहित है संस्करण 2.3.5. अंतिम।

https://issues.jboss.org/browse/RESTEASY-711 देखें लेकिन उल्लिखित कार्यवाही को अनदेखा करें, यह संस्करण 2.3.5 तक काम नहीं करता है।

काम कर समाधान जड़ में Restwasy वितरण संस्करण 2.3.5.Final इस फाइल को डाउनलोड करने के लिए या इसके बाद के संस्करण, यह निकालने और resteasy-jboss-modules-2.3.5.Final.zip

निकालें के लिए देखो है जेबॉस एएस 7.1.1 और आराम से नए संस्करण में अपडेट किया जाएगा। इस चरण के बाद, उपरोक्त सभी कोड बस काम करता है।

विधेयक बर्क के लिए धन्यवाद समाधान के लिए मुझे बात करने के लिए,

0

आप MessageBodyReader लागू कर सकते हैं जो सत्यापन करने के लिए JAXB Unmarshaller पर Schema सेट करता है। नमूना कोड के लिए इसी तरह की एक प्रश्न के मेरा उत्तर की जाँच:

+0

हाँ, मैं हाथ में समस्या के लिए मेरे शोध के दौरान यह है कि समाधान देखा है। फिर भी, सजावटी को काम करना चाहिए और प्रतीत होता है कि वे नहीं करते हैं। मैंने जो बग रिपोर्ट जुड़ी है उसे पुनः खोला जाना चाहिए, आईएमएचओ। एक संदेशबॉडी रीडर लिखना निश्चित रूप से काम करेगा, लेकिन मेरी आंखों में यह मेरी समस्या का गलत समाधान है। त्वरित जवाब के लिए वैसे भी धन्यवाद! – Frank