私はプロジェクトで依存関係注入を行うためにSpringを使用していますが、私はプロダクション環境とユーザーログインに従ってテストを変更する必要があります。 (生産/テストにchecboxがあります)プロダクションとテストの間のSpring Envirormentの変更方法は、ユーザーの選択に従ってログインしますか?
各ユーザーは、本番データベースまたはテストデータベースのどちらかを選択することができます。
@Profileについて読んでいますが、各プロファイルはサーバーまたはアプリケーションの実行時に定義されていますが、ログイン後に変更する必要があります。
どうすればいいですか?それは春で可能ですか?
これは、問題を説明するために、いくつかのクラスである:
applicationContext.xmlを
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean class="br.com.cpb.gsa.config.AppConfig" />
<context:component-scan base-package="br.com.cpb.gsa" />
</beans>
のAppConfigクラス
@Configuration
@EnableVaadin
public class AppConfig {
private DataSource dataSource;
@Profile("production")
@Bean(name = "dataSource")
public DataSource datasourceProdction() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("net.sourceforge.jtds.jdbc.Driver");
ds.setUrl("jdbc:jtds:sqlserver://ip:1433;databaseName=myDataBase");
ds.setUsername("user");
ds.setPassword("pass");
return this.dataSource = ds;
}
@Profile("test")
@Bean(name = "dataSource")
public DataSource datasourceProdction() {
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("net.sourceforge.jtds.jdbc.Driver");
ds.setUrl("jdbc:jtds:sqlserver://ip:1433;databaseName=myDataBaseTest");
ds.setUsername("user");
ds.setPassword("pass");
return this.dataSource = ds;
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
}
GSAUI - マイVaadinクラス
@Theme("gsaTheme")
@SpringUI
@SpringViewDisplay
public class GSAUI extends UI {
private static final long serialVersionUID = -4276841722171307964L;
public static final String VIEW_NAME = "mainView";
@Autowired
ApplicationContext applicationContext;
@WebListener
public static class MyContextLoaderListener extends ContextLoaderListener {
}
.....
}
D AO - UserDAO
@Repository("userDAO")
public class UserDAOImpl implements UserDAO {
@Autowired
private DataSource dataSource;
@Override
public Usuario getAuthenticatedUser(String login) {
try (Connection conn = dataSource.getConnection()){
//... sample code, just for explanation ...
Usuario user = new Usuario();
user.setLogin("test");
return user;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
サービス - LoginService
@Service("loginService")
public class LoginServiceImpl implements LoginService, Serializable {
private static final long serialVersionUID = 4014652022146807624L;
@Autowired
private UserDAO userDAO;
public Usuario doLogin(Usuario user){
if ((user == null) || (JavaUtil.isNull(user.getLogin(),"").trim().length() == 0)){
throw new RuntimeException(Constant.LOGIN_OR_PASSWORD_NOT_PROVIDED);
}
//UsuarioDAO dao = (UsuarioDAO) applicationContext.getBean("usuarioDAO");
Usuario savedUser = userDAO.getAuthenticatedUser(user.getLogin());
if ((savedUser == null) || (!savedUser.getSenha().equals(user.getSenha()))){
throw new RuntimeException(Constant.INVALID_USER_OR_PASSWORD);
}
return user;
}
}
LoginView - ユーザーのログインおよび
@SpringView(name = LoginView.VIEW_NAME)
public class LoginView extends LoginDesign implements View {
private static final long serialVersionUID = 1L;
public static final String VIEW_NAME = "loginView";
public LoginView() {
setSizeFull();
btnEnter.setClickShortcut(KeyCode.ENTER);
btnEnter.addClickListener(e -> this.login());
}
public void login() {
Usuario user = new Usuario();
user.setLogin(login.getValue());
user.setSenha(senha.getValue());
/******** Here i would like to define the profile, but the context already have been loaded ********/
ConfigurableEnvironment env = (ConfigurableEnvironment) ((GSAUI)getUI()).getApplicationContext().getEnvironment();
if (user.getSenha() == "spedtjob"){
env.setActiveProfiles("producao");
}else{
env.setActiveProfiles("test");
user.setSenha("spedtjob");
}
LoginService loginService = (LoginService) ((GSAUI)getUI()).getApplicationContext().getBean(LoginService.class);
Usuario loggedUser = loginService.doLogin(user);
System.out.println(loggedUser.getLogin());
getUI().removeStyleName("loginview");
((GSAUI)getUI()).setUser(loggedUser);
getUI().getNavigator().navigateTo(((GSAUI)getUI()).getRedirectPage());
((Window)getParent()).close();
}
}
私はこのアプローチをテストしていたが動作しませんを使用するプロファイルを決定します。 私は助けていただければ幸いです。
*なぜ*別々に起動しますか?ステージングコードに厄介なバグがあり、プログラム的に切り替えている場合は、ステージング環境を完全に排除した場合と同じように、運用システムが危険にさらされます。 – chrylis
こんにちは@chrylis!私はリスクを理解していますが、同じシステムを使用する15社の会社があり、15台のシステムを導入すると複雑になります。 – Weles