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