@SessionScoped do Weld não mantém sessão no Tomcat?

Gostaria de saber se alguém saberia me dizer como resolver o problema da não persistência da sessão com Tomcat e Weld.

Plataforma:

  • Tomcat 8.0.28
  • JSF 2.2
  • Weld 2.4.2-Final
  • Primefaces 6.0

Sua pergunta está totalmente confusa amigo, posta o código do seu Bean pra gente dar uma olhada e tentar entender do que você está falando. Mas um chute é que talvez você tenha misturado anotações do CDI com outras.

LanguageBean.java

@Named
@SessionScoped
public class LanguageBean implements Serializable {

	private static final long serialVersionUID = 2811417677037057432L;

	private String value;

	private Locale locale;

	@Inject
	private FacesContext context;

	@PostConstruct
	public void init() {
		this.locale = this.context.getViewRoot().getLocale();
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public Locale getLocale() {
		return locale;
	}

	public void setLocale(Locale locale) {
		this.locale = locale;
	}

	public String getLanguage() {
		return this.locale.getLanguage();
	}

	public List<String> getLanguages() {
		return findFileLanguages();
	}

	public void getChangeLanguage(ValueChangeEvent event) {
		System.out.println(event.getNewValue().toString());
		changeLanguageByString(event.getNewValue().toString());
	}

	private void changeLanguageByString(String language) {
		this.locale = new Locale(language);
		this.context.getViewRoot().setLocale(new Locale(language));
		this.context.getApplication().setDefaultLocale(new Locale(language));
	}
}

O Locale não é mantido ao navegar pelas paginas.

Use o @SessionScope do JSF

@belofeso
põe o import desse “SessionScoped” que vc está usando… O do CDI é:

import javax.enterprise.context.SessionScoped;

@DarkElf Não funcionou, continua a redefinir o idioma quando navega.

@Satangozo estou usando a javax.enterprise.context.SesssionScoped, testei agora com javax.faces.bean.SessionScoped, está correndo o mesmo problema

Eu arrumei a classe e percebi que só a tradução dos enum’s são mantidas, não se porque a sessão não mantém o local par as demais.

import java.io.Serializable;
import java.util.Locale;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.serviceclub.util.jsf.qualifier.Bundle;

@Named
@SessionScoped
public class LanguageBean implements Serializable {

	private static final long serialVersionUID = 2811417677037057432L;

	private String value;

	private Locale locale;

	@Inject
	private FacesContext context;

	@Inject
	@Bundle
	private transient ResourceBundle bundle;

	@Inject
	@Bundle
	private String baseName;

	@PostConstruct
	public void init() {
		// this.locale = this.context.getViewRoot().getLocale();
		this.locale = this.bundle.getLocale();
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

	public Locale getLocale() {
		return locale;
	}

	public void setLocale(Locale locale) {
		this.locale = locale;
	}

	public String getLanguage() {
		return this.locale.getLanguage();
	}

	public List<String> getLanguages() {
		return findFileLanguages();
	}

	public void getChangeLanguage(ValueChangeEvent event) {
		changeLanguageByString(event.getNewValue().toString());
	}

	public String enumXlate(Enum<?> enumType) {
		this.bundle = ResourceBundle.getBundle(this.baseName, this.locale);
		return this.bundle.getObject("enum_" + enumType.toString().toLowerCase()).toString();
	}

	public String localeXlate(String locale) {
		this.bundle = ResourceBundle.getBundle(this.baseName, this.locale);
		return this.bundle.getObject("loc_" + new Locale(locale).getLanguage()).toString();
	}

	private void changeLanguageByString(String language) {
		this.locale = new Locale(language);
		this.bundle = ResourceBundle.getBundle(this.baseName, this.locale);
		this.context.getViewRoot().setLocale(this.locale);
		this.context.getApplication().setDefaultLocale(this.locale);
	}
    }