2009-01-10 15 views
7

Robię projekt w szwie, który wymaga spokojnych adresów URL. Mam widok mapowany do/group/{grupa}/{locale}. Na tej stronie mam listę tak zwanych wiadomości. Każda wiadomość ma przycisk do zapisania zmian w wiadomości. Wiąże się to z fasoli działania tak:Wyłączanie filtru przekierowania szwów

<h:commandButton type="submit" value="Save Changes" action="#{groupAction.update}" /> 

Każda wiadomość ma kotwicę, więc/grupa/{grupa}/{locale} # {id} mogą być wykorzystane, aby przeglądarka przejść do tej kotwicy. To dlatego muszę przekierowanie po postu:

<page view-id="/group.xhtml"> 
    <rewrite pattern="/group/{group}/{locale}"/> 

    <param name="group" value="#{groupAction.group}"/> 
    <param name="locale" value="#{groupAction.locale}"/> 

    <navigation from-action="#{groupAction.update}"> 
    <redirect view-id="/group.xhtml?group=#{group}&locale=#{locale}##{id}"/> 
    </navigation> 
</page> 

Również mam następującą regułę przekierowania (UrlRewriteFilter), aby dostać się do właściwego relaksującego URL:

<outbound-rule> 
    <from>^/group.xhtml\?group=([\.\w]+)&locale=([\.\w]+)\#([\.\w]+)\?cid=(\d*)$</from> 
    <to type="temporary-redirect" last="true">/group/$1/$2#$3</to> 
</outbound-rule> 

I pozbawić conversationId tutaj. Zostało to przetestowane i działa. Jednak szew nadal dodaje "? ConversationId = {cid}". Więc w czym problem? Wyobraź sobie adres URL, taki jak "/ group/{group}/{locale} # {id}? ConversationId = {cid}". Oczywiście przeglądarka tego nie lubi i nie będzie automatycznie przechodzić do tej kotwicy.

Zrobiłem rozeznanie i odkryła mój problem w dokumentacji szew:

29.1.4.2. Propagacja konwersacji z przekierowaniami Ten filtr pozwala Seamowi propagować kontekst konwersacji w przekierowaniach przeglądarki. Przechwytuje wszelkie przekierowania przeglądarki i dodaje parametr żądania, który określa identyfikator konwersacji Seam. Filtr przekierowanie będzie przetwarzać wszystkie żądania domyślnie, ale takie zachowanie może być również regulowana w components.xml:

<web:redirect-filter url-pattern="*.seam"/> 

ja nie potrzebuję przekierowania filtr i starałem oddanie czegoś nieprawidłowy w URL-wzór do "wyłącz" filtr. To jednak nie zadziałało. Moje pytanie brzmi teraz:

Jak wyłączyć filtr przekierowań w szwie?

Nie mogę znaleźć odpowiedzi. Dokumentacja szwów mówi o wyłączeniu go w web.xml, ale moje próby jeszcze się nie udały.

Odpowiedz

7

Dowiedziałem się, skąd pochodzi niepoprawny parametr ciągu zapytania conversationId.

W <redirect/> wyniki w wywołaniu org.jboss.seam.faces.FacesManager.redirect(String viewId, Map<String, Object> parameters, boolean includeConversationId)

Nazywa się to z następującego kodu w org.jboss.seam.faces.Navigator który ustawia includeConversationId true:

FacesManager.instance().redirect(viewId, parameters, true); 

ja nie widzę żadnych sposobem na uniknięcie tego, więc poprawka/obejściem jest wykonanie przekierowania programistycznego w metodzie akcji za pomocą:

FacesManager.instance().redirect(viewId, parameters, false); 
1

OK, udało mi się zabić przekierowania filtr dodając to do mojego compononents.xml:

<web:redirect-filter disabled="true" installed="false" /> 

Jednak nadal istnieje mój główny problem, tak, że najwyraźniej nie był problem. Wciąż dodaje on parametr conversationId jako dodatkowy ciąg zapytania do adresu URL. Apperently robię coś nie tak od it has been done before.

@Adeel Ansari:

components.xml:

<web:rewrite-filter view-mapping="/seam/*" /> 

pages.xml zobaczyć moje pierwsze pytanie.

+0

Czy skonfigurowałeś UrlRewriteFilter w swoim web.xml? –

+0

Tak, mam i UrlRewriteFilter działa, ale nadal szew dodaje? ConversationId –

+0

Czy próbowałeś całkowicie usunąć SeamRedirectFilter z web.xml? może być po prostu do testowania sprawy. –