Попробуйте SerializerMethodField
Пример (не проверено):
class MySerializer(serializers.ModelSerializer):
thumbnail_url = serializers.SerializerMethodField('get_thumbnail_url')
def get_thumbnail_url(self, obj):
return self.context['request'].build_absolute_uri(obj.thumbnail_url)
Запрос должен быть доступен для сериализатора, чтобы он мог создать полный абсолютный URL для вас. Один из способов заключается в том, чтобы явно передать его при создании сериализатора, подобно этому:
serializer = MySerializer(account, context={'request': request})
Установите параметры запроса GET как управляемые свойства в faces-config.xml
, чтобы вам не нужно было собирать их вручную:
<managed-bean>
<managed-bean-name>forward</managed-bean-name>
<managed-bean-class>com.example.ForwardBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>action</property-name>
<value>#{param.action}</value>
</managed-property>
<managed-property>
<property-name>actionParam</property-name>
<value>#{param.actionParam}</value>
</managed-property>
</managed-bean>
Таким образом, запрос forward.jsf?action=outcome1&actionParam=123
позволит JSF установить action
и actionParam
параметры как action
и actionParam
свойства ForwardBean
.
Создайте маленькое представление forward.xhtml
(настолько маленькое, что оно помещается в буфер ответов по умолчанию (часто 2 КБ), чтобы его можно было сбросить обработчиком навигации, в противном случае необходимо увеличить буфер ответов в конфигурации сервлет-контейнера), что вызывает метод bean-компонента в beforePhase
из f:view
:
<!DOCTYPE html>
<html xmlns:f="http://java.sun.com/jsf/core">
<f:view beforePhase="#{forward.navigate}" />
</html>
ForwardBean
может выглядеть следующим образом:
public class ForwardBean {
private String action;
private String actionParam;
public void navigate(PhaseEvent event) {
FacesContext facesContext = FacesContext.getCurrentInstance();
String outcome = action; // Do your thing?
facesContext.getApplication().getNavigationHandler().handleNavigation(facesContext, null, outcome);
}
// Add/generate the usual boilerplate.
}
navigation-rule
говорит само за себя (примечание <redirect />
записей, которые делали бы ExternalContext#redirect()
вместо ExternalContext#dispatch()
под обложками):
<navigation-rule>
<navigation-case>
<from-outcome>outcome1</from-outcome>
<to-view-id>/outcome1.xhtml</to-view-id>
<redirect />
</navigation-case>
<navigation-case>
<from-outcome>outcome2</from-outcome>
<to-view-id>/outcome2.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
Альтернативой является использование forward.xhtml
в качестве
<!DOCTYPE html>
<html>#{forward}</html>
и обновите метод navigate()
, который будет вызываться в @PostConstruct
(который будет вызван после построения бина и установки всех управляемых свойств):
@PostConstruct
public void navigate() {
// ...
}
Он имеет тот же эффект, однако сторона вида не совсем самодокументируемый. Все, что он в основном делает - это печатает ForwardBean#toString()
(и тем самым неявно создает бин, если его еще нет).
Обратите внимание, что для пользователей JSF2 есть более чистый способ передачи параметров с <f:viewParam>
и более надежный способ обработки перенаправления / навигации с помощью <f:event type="preRenderView">
. См. Также среди прочих:
Предположим, что foo.jsp - это ваш файл jsp. и следующий код - это кнопка, которую вы хотите перенаправить.
<h:commandButton value="Redirect" action="#{trial.enter }"/>
И теперь мы проверим метод для направления в вашем классе java (службы)
public String enter() {
if (userName.equals("xyz") && password.equals("123")) {
return "enter";
} else {
return null;
}
}
, и теперь это часть файла Face-config.xml
<managed-bean>
<managed-bean-name>'class_name'</managed-bean-name>
<managed-bean-class>'package_name'</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<navigation-case>
<from-outcome>enter</from-outcome>
<to-view-id>/foo.jsp</to-view-id>
<redirect />
</navigation-case>