2012-06-12 9 views
8

Nel nostro progetto facciamo uso di frammenti web per definire alcuni servlet in modo che gli artefatti possano essere facilmente utilizzati in altri progetti.Elementi mancanti da web-fragment.xml nell'efficace web.xml

La cosa strana ora è che abbiamo un file web-fragment.xml, ma alcuni dei suoi contenuti non vengono aggiunti all'efficace web.xml.

By esempio:

I seguenti configurazioni sia presente nel web.xml efficace:

<filter> 
    <filter-name>superUserAutomaticLogon</filter-name> 
    <filter-class>nl.caiw.cool.util.filters.SuperUserAutomaticLogonFilter</filter-class> 
    <async-supported>false</async-supported> 
</filter> 

Ma seguenti non è:

<filter> 
    <filter-name>sitemesh</filter-name> 
    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>sitemesh</filter-name> 
    <url-pattern>/toolbox/modules/*</url-pattern> 
</filter-mapping> 

Abbiamo provato diverse cose, ma non possiamo capirlo. Spero che qualcuno qui possa mandarci nella giusta direzione.

Grazie in anticipo.

+0

Dove si trovano i tuoi frammenti? Che aspetto ha l'elemento del documento del tuo file 'web.xml'? Quale versione di Tomcat stai eseguendo? –

risposta

9

La cosa strana ora è che abbiamo un file web-fragment.xml, ma alcuni dei suoi contenuti non vengono aggiunti all'efficace web.xml.

Ben prima di tutto, un web-fragment.xml non otterrebbe fisicamente incluso nella principale web.xml. Quindi quando dici che non viene aggiunto all'effettivo web.xml, penso che potresti sbagliare lì.

I frammenti Web consentono ai compomenti di registrarsi al web.xml principale in fase di runtime. L'unica prova che troverai di questo accadimento è in realtà cercando di usare il compoment.

Ho provato un semplice esempio ciao-mondo con frammenti di web e l'ho fatto funzionare. Ho usato Tomcat 7 per questo con una webapp Servlet 3.0.

mio principale web.xml all'interno WEB-INF si presenta come il qui sotto:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>hello-world</display-name> 

    <absolute-ordering> 
     <name>filters</name> 
    </absolute-ordering> 
</web-app> 

ho capito che l'unico Wey abbiamo potuto registrare un web-fragment.xml era aderendo alle regole di seguito:

  1. Deve essere denominato web-fragment.xml
  2. Deve essere inserito in un file JAR all'interno di WEB-INF/lib
  3. Il web-fragment.xml deve essere presente all'interno della directory META-INF del file JAR.

mio web-fragment.xml assomiglia:

<?xml version="1.0" encoding="UTF-8"?> 
<web-fragment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd" id="WebAppFragment_ID" version="3.0"> 
    <name>filters</name> 
    <filter> 
     <filter-name>interceptor</filter-name> 
     <filter-class>com.adarshr.Interceptor</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>interceptor</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-fragment> 

Con quanto sopra configurazione minima, sono stato in grado di ottenere il filtro Interceptor essere licenziato, anche se è stata collocata nella web-fragment.xml.

Infine, ecco la mia struttura di directory (generato usando http://www.adarshr.com/treegen)

+- hello-world 
    | 
    +- WEB-INF 
     | 
     +- lib 
     | | 
     | |- my-library.jar 
     | 
     |- web.xml 

Il file JAR my-library.jar ha la struttura di seguito:

+- my-library.jar 
    | 
    +- META-INF 
     | 
     |- web-fragment.xml 

Alcune referenze:

+1

Abbiamo tutto ciò, ma la cosa strana è che alcuni filtri non funzionano e alcuni lo fanno. Quindi verrà usato il web-fragment.xml e lo registrerà nel web.xml, ma per qualche motivo sconosciuto alcune dichiarazioni valide non lo faranno. Se mettiamo la dichiarazione mancante nel web.xml funziona come un incantesimo. Grazie per il tuo impegno finora. – pderaaij

+0

Sei sicuro che le tue modifiche vengano effettivamente implementate e che non stai utilizzando una versione obsoleta di 'web-fragment.xml'? Prova a pulire il temp e le directory di lavoro del tuo contenitore. – adarshr

+0

Ne siamo sicuri. Anche provato su più ambienti e hanno lo stesso problema. – pderaaij

1

Forse si può verificare su web.xml che metadata-complete="true" non è impostato. Secondo le specifiche Servlet se questo flag è impostato su true, non verrà caricato web-fragment.xml o qualsiasi annotazione come @WebFilter

+0

Puntatore a dove questo è menzionato nella specifica sarebbe un bel da includere nella risposta. – dade

+1

@dade Ecco la 'speclet servlet 3.0' (' jsr 315') dove definisce come deve essere usato l'attributo complete metadata sull'elemento web-app. http://download.oracle.com/otn-pub/jcp/servlet-3.0-mrel-full-oth-JSpec/servlet-3_0-mrel-spec.pdf#page=26 –