2011-09-27 13 views
5

Ben JBoss AS 7 içinde çalışan bir uygulama benim (sözleşme ilk) REST arabirimi üzerinde gelen gelen XML dosyalarını doğrulamak çalışıyorum Pretty için bir @Decorator yazdım - Yazdırma (JBoss RESTeasy belgelerinde örnek olarak) ve unmarshaller için XML şema doğrulamasını değiştirmek için benzer bir. Ne yazık ki, unmarshaller için dekoratör hiç çağrılmadı.JBoss RESTeasy JAX-RS JAXB şema doğrulama ile dekoratör

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 {} 

Ve uygulama: Şimdi

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; 
    } 
} 

Doğrulama için ek açıklama (yani çalışmıyor) İşte

Pretty dekoratör kodu şöyledir:

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 {} 

uygulaması:

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; 
    } 
} 

Ve DİNLENME arayüzünün kodu: Aynı DİNLENME şekli

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; 
} 

, (güncelleme) @Pretty Dekoratör @Validate yapmazken çağrılır. Burada neyi yanlış yapıyorum?

Kapalı olan eski bir Decorator for Jaxb unmarshaller doesn't work hata buldum.

Yorumlar, her şeyin işe yaradığını söylüyor ve yukarıdaki kod, çözüm de dahil olmak üzere hemen hemen tam olanı. Yine de, Unmarshaller için hiçbir şey işe yaramıyor.

cevap

2

Nihayet bu sorun 7.

sorun AS JBoss için çözüldü arabası kadar olan Resteasy uygulanması yatıyor sürüm 2.3.5.Final.

Bkz. https://issues.jboss.org/browse/RESTEASY-711, ancak belirtilen geçici çözümü dikkate almayın, sürüm 2.3.5'e kadar çalışmaz.

çalışma çözüm kökü bu dosyayı Restwasy dağıtım sürümü 2.3.5.Final indirmek veya yukarıda, onu çıkarmak ve resteasy-jboss-modules-2.3.5.Final.zip

Özü bakmaktır JBoss AS 7.1.1 ve resteasy, yeni sürüme güncellenecektir. Bu adımdan sonra, yukarıdaki kodun tamamı çalışır.Bill Burke'e

sayesinde çözüme bana gelin,

0

Doğrulama işlemini gerçekleştirmek için JAXB Unmarshaller üzerinde Schema ayarlayan bir MessageBodyReader uygulayabilirsiniz. Örnek kodun benzer bir soruya cevabım göz atın:

+0

Evet, eldeki sorunu için benim araştırma sırasında bu çözümü gördük. Yine de, dekoratörler çalışmalı ve görünüşte görmüyorlar. Bağladığım hata raporu tekrar açılmalı, IMHO. Bir MessageBodyReader yazmak kesinlikle işe yarayacak, ama benim gözümde sorunum için yanlış bir çözüm. Yine de hızlı cevap için teşekkürler! – Frank