2011-09-27 13 views
5

Próbuję sprawdzić wszystkie przychodzące pliki XML, które przechodzą przez mój (pierwszy kontrakt) interfejs REST w aplikacji działającej w JBoss AS 7. Napisałem @Decorator dla Pretty- Drukowanie (jak na przykładzie w dokumentacji JBoss RESTeasy) i analogiczne do włączania sprawdzania schematu XML dla unmarshallera. Niestety, dekorator dla unmarshallera nigdy nie jest wywoływany.JBoss RESTeasy JAX-RS Sprawdzanie poprawności schematu JAXB z dekoratorem

Oto kod dla Pretty Dekorator:

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

i wdrożenie:

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

Teraz adnotacji do sprawdzania poprawności (który nie działa):

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

Realizacja:

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

I kod interfejsu REST:

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

Na tej samej metody REST (aktualizacja) @Pretty Dekorator zostaje wywołany, gdy @Validate nie. Co ja tu robię źle?

Znalazłem stary błąd Decorator for Jaxb unmarshaller doesn't work, który jest zamknięty.

W komentarzach napisano, że wszystko działa, a powyższy kod jest prawie dokładnie tym, z którego pochodzi, w tym rozwiązaniem. Niemniej nic nie działa dla Unmarshallera.

Odpowiedz

2

Ostatecznie problem ten został rozwiązany przez JBoss AS 7.

problem leży w realizacji Resteasy który jest wadliwy, aż wersja 2.3.5.Final.

Zobacz https://issues.jboss.org/browse/RESTEASY-711, ale zignoruj ​​wspomniane obejście, nie działa do wersji 2.3.5.

Roztwór roboczy jest pobranie Restwasy wersji dystrybucji 2.3.5.Final lub powyżej, rozpakuj go i szukać resteasy-jboss-modules-2.3.5.Final.zip

Wyciąg ten plik w katalogu głównym JBoss AS 7.1.1 i resteasy zostaną zaktualizowane do nowej wersji. Po tym kroku wszystkie powyższe kody działają.

Dzięki Bill Burke wskazać mnie do rozwiązania,

0

Użytkownik może wdrożyć MessageBodyReader, który ustawia Schema na JAXB Unmarshaller w celu przeprowadzenia sprawdzania poprawności. Dla przykładowego kodu sprawdź moją odpowiedź na podobne pytanie:

+0

Tak, widziałem to rozwiązanie podczas moich badań na problem pod ręką. Mimo to dekoratorzy powinni działać i pozornie nie działają. Zgłoszony przeze mnie raport o błędzie powinien zostać ponownie otwarty, IMHO. Pisanie MessageBodyReader na pewno by działało, ale w moich oczach jest to niewłaściwe rozwiązanie mojego problemu. Mimo to dzięki za szybką odpowiedź! – Frank

Powiązane problemy