我刚刚为客户启动了一个新的GWT项目,我很想听听人们对各种GWT MVC架构的体验.在最近的一个项目中,我使用了GXT MVC以及自定义消息传递解决方案(基于Appcelerator的MQ).GXT MVC工作正常,但对GWT来说似乎有点过分,并且难以使用浏览器历史记录.我听说过PureMVC和GWTiger,但从未使用它们.我们的定制MQ解决方案工作得很好,但是很难用JUnit测试组件.
另外,我听说Google Wave(GWT应用程序)是使用Model-View-Presenter模式编写的.最近发布了一个示例MVP应用程序,但是看一下代码,它似乎并不直观.
如果您正在构建新的GWT应用程序,您将使用哪种架构?您选择的利弊是什么?
谢谢,
马特
我有一个应用程序,其中包含application.properties中列出的许多数据源设置.我有一个@ConfigurationProperties加载这些设置的类.现在我想从这个ConfigurationProperties类中获取值并使用它们来动态创建DataSource bean.我尝试过使用@PostConstruct和实现BeanFactoryPostProcessor.但是,BeanFactoryPostProcessor处理似乎很早就发生了 - 在我的ConfigurationProperties课程填充之前.如何DataSource使用Spring Boot快速读取属性并创建bean?
这是我的application.properties的样子:
ds.clients[0]=client1|jdbc:db2://server/client1
ds.clients[1]=client2,client3|jdbc:db2://server/client2
ds.clients[2]=client4|jdbc:db2://server/client4
ds.clients[3]=client5|jdbc:db2://server/client5
Run Code Online (Sandbox Code Playgroud)
我的ConfigurationProperties类:
@Component
@ConfigurationProperties(prefix = "ds")
public class DataSourceSettings {
public static Map<String, String> CLIENT_DATASOURCES = new LinkedHashMap<>();
private List<String> clients = new ArrayList<>();
public List<String> getClients() {
return clients;
}
public void setClients(List<String> clients) {
this.clients = clients;
}
@PostConstruct
public void configure() {
for (String client : clients) {
// extract client name
String[] parts …Run Code Online (Sandbox Code Playgroud) 我是一个Grunt新手,我正在尝试转换一个Angular应用程序(基于angular-seed)来将它用于CSS/JS concat/minification.我有一个index.html文件,用于定义CSS和JS文件:
<!-- build:css css/myjmh.css -->
<link rel="stylesheet" href="lib/bootstrap/bootstrap.min.css"/>
<link rel="stylesheet" href="lib/font-awesome/font-awesome.min.css"/>
<link rel="stylesheet" href="lib/toaster/toaster.css"/>
<link rel="stylesheet" href="css/app.css"/>
<link rel="stylesheet" href="css/custom.css"/>
<link rel="stylesheet" href="css/responsive.css"/>
<!-- endbuild -->
...
<!-- build:js js/myjmh.min.js -->
<script src="lib/jquery/jquery-1.10.2.min.js"></script>
<script src="lib/bootstrap/bootstrap.min.js"></script>
<script src="lib/angular/angular.min.js"></script>
<script src="lib/angular/angular-animate.min.js"></script>
<script src="lib/angular/angular-cookies.min.js"></script>
<script src="lib/angular/angular-resource.min.js"></script>
<script src="lib/angular/angular-route.min.js"></script>
<script src="lib/fastclick.min.js"></script>
<script src="lib/toaster/toaster.js"></script>
<script src="lib/webshim/modernizr.min.js"></script>
<script src="lib/webshim/polyfiller.min.js"></script>
<script src="js/app.js"></script>
<script src="js/services.js"></script>
<script src="js/controllers.js"></script>
<script src="js/filters.js"></script>
<script src="js/directives.js"></script>
<!-- endbuild -->
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用grunt-usemin及其useminPrepare任务从我的HTML中获取这些值.
这是我的Gruntfile.js:
module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
clean: …Run Code Online (Sandbox Code Playgroud) 我有一个名为Browser的POJO,我用Hibernate Validator注释进行了注释.
import org.hibernate.validator.constraints.NotEmpty;
public class Browser {
@NotEmpty
private String userAgent;
@NotEmpty
private String browserName;
...
}
Run Code Online (Sandbox Code Playgroud)
我编写了以下单元测试,试图验证我的Controller方法是否捕获了验证错误.
@Test
public void testInvalidData() throws Exception {
Browser browser = new Browser("opera", null);
MockHttpServletRequest request = new MockHttpServletRequest();
BindingResult errors = new DataBinder(browser).getBindingResult();
// controller is initialized in @Before method
controller.add(browser, errors, request);
assertEquals(1, errors.getErrorCount());
}
Run Code Online (Sandbox Code Playgroud)
这是我的Controller的add()方法:
@RequestMapping(value = "/browser/create", method = RequestMethod.POST)
public String add(@Valid Browser browser, BindingResult result, HttpServletRequest request) throws Exception {
if (result.hasErrors()) {
request.setAttribute("errorMessage", result.getAllErrors());
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试删除Spring Security中的"ROLE_"前缀.我尝试的第一件事是:
http.servletApi().rolePrefix("");
Run Code Online (Sandbox Code Playgroud)
这没用,所以我尝试BeanPostProcessor按http://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-中的建议创建一个jc.html#m3to4-role-prefixing-disable.那也行不通.
最后,我尝试创建自己的SecurityExpressionHandler:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.expressionHandler(webExpressionHandler())
.antMatchers("/restricted").fullyAuthenticated()
.antMatchers("/foo").hasRole("mycustomrolename")
.antMatchers("/**").permitAll();
}
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setDefaultRolePrefix("");
return defaultWebSecurityExpressionHandler;
}
Run Code Online (Sandbox Code Playgroud)
但是,这也不起作用.如果我使用"hasAuthority(roleName)"而不是hasRole,它按预期工作.
是否可以从Spring Security的hasRole检查中删除ROLE_前缀?
我的Spring Boot应用程序中有一个applicationContext.xml文件.在这个文件中,它有一个属性占位符 - $ {profile.services.url} - 用于配置<jaxws:client> bean的"address"属性.
在我的Application.java类中,我导入了这个文件.
@ImportResource("classpath:applicationContext.xml")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
我在application.properties中定义了"profile.services.url".但是,在我的XML文件中构建bean时无法识别它.我尝试添加以下内容,但它似乎不起作用.
<context:property-placeholder location="classpath:application.properties"/>
Run Code Online (Sandbox Code Playgroud)
关于如何让@ImportResource识别Spring Boot的属性支持的任何建议?
我在我的项目中设置了RestTemplate和AsyncRestTemplate,类似于以下内容:
http://vincentdevillers.blogspot.fr/2013/10/a-best-spring-asyncresttemplate.html
我注意到除非我将httpRequestFactory()bean更改为以下内容,否则连接超时实际上不起作用:
@Bean
public ClientHttpRequestFactory httpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient());
factory.setConnectTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
factory.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
return factory;
}
Run Code Online (Sandbox Code Playgroud)
如果我将DEFAULT_READ_TIMEOUT_MILLISECONDS设置为5,则在使用restTemplate(按预期)时会发生超时.但是,当我使用AsyncRestTemplate时,不会发生超时.我已经像httpRequestFactory()那样修改了asyncHttpRequestFactory(),但是没有骰子.
@Bean
public AsyncClientHttpRequestFactory asyncHttpRequestFactory() {
HttpComponentsAsyncClientHttpRequestFactory factory = new HttpComponentsAsyncClientHttpRequestFactory(asyncHttpClient());
factory.setConnectTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
factory.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
return factory;
}
Run Code Online (Sandbox Code Playgroud)
这是我在Spring MVC控制器中尝试使用AsyncRestTemplate的方法:
String url = "...";
// Start the clock
long start = System.currentTimeMillis();
ListenableFuture<ResponseEntity<String>> results = asyncRestTemplate.getForEntity(url, String.class);
// Wait until the request is finished
while (!(results.isDone())) {
Thread.sleep(10); //millisecond pause between each check
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - start));
return results.get().getBody();
Run Code Online (Sandbox Code Playgroud)
如何让AsyncRestTemplate读取我的连接超时设置? …
我正在尝试使用Okta 进行spring-boot-security-saml-sample应用程序.要将Okta添加为提供程序,我对WebSecurityConfig.java进行了以下更改:
https://gist.github.com/mraible/c8b52972f76e6f5e30d5
我发现以下问题提供了一些指导,但我无法完成工作.
这就是我在Okta上使用的值:
Application label: Spring Boot SAML App
Force Authentication: false
Post Back URL: http://localhost:8080/
Name ID Format: EmailAddressRecipient
Recipient: http://localhost:8080/saml/SSO/alias/defaultAlias
Audience Restriction: com:vdenotaris:spring:sp
authnContextClassRef: PasswordProtectedTransport
Response: Signed
Assertion: Signed
Request: Compressed
Destination: http://localhost:8080/saml/SSO/alias/defaultAlias
Default Relay State: (none)
Attribute Statements: email|${user.email},firstName|${user.firstName}
Run Code Online (Sandbox Code Playgroud)
看起来它可以从日志中运行:
[2014-12-30 12:18:33.004] boot - 18748 DEBUG [http-nio-8080-exec-8] --- BaseMessageEncoder: Successfully encoded message.
[2014-12-30 12:18:33.004] boot - 18748 DEBUG [http-nio-8080-exec-8] --- HttpSessionStorage: Storing message a12gf64fh3f35fgh2a8dd1fd0i0dc02 to session C5D010344EF5D022718B12B6D25F1D1E
[2014-12-30 12:18:33.004] boot - 18748 …Run Code Online (Sandbox Code Playgroud) 我正在尝试更改JHipster,因此它使用JSON对象进行身份验证而不是表单参数.我已经成功地为其JWT认证机制做了这项工作.现在我想为其他身份验证选项做这件事.
是否有一种简单的方法可以更改Spring Security的默认安全配置以允许此操作?以下是JHipster现在使用的内容:
.and()
.rememberMe()
.rememberMeServices(rememberMeServices)
.rememberMeParameter("remember-me")
.key(env.getProperty("jhipster.security.rememberme.key"))
.and()
.formLogin()
.loginProcessingUrl("/api/authentication")
.successHandler(ajaxAuthenticationSuccessHandler)
.failureHandler(ajaxAuthenticationFailureHandler)
.usernameParameter("j_username")
.passwordParameter("j_password")
.permitAll()
Run Code Online (Sandbox Code Playgroud)
我想发送以下作为JSON而不是表单参数:
{username: "admin", password: "admin", rememberMe: true}
Run Code Online (Sandbox Code Playgroud) 我有一个Ionic应用程序,它有一个user提供程序,有一个signup()方法:
doSignup() {
// set login to same as email
this.account.login = this.account.email;
// Attempt to login in through our User service
this.user.signup(this.account).subscribe((resp) => {
this.navCtrl.push(MainPage);
}, (err) => {
//console.log('error in signup', err);
// ^^ results in 'You provided 'undefined' where a stream was expected'
//this.navCtrl.push(MainPage);
// Unable to sign up
let toast = this.toastCtrl.create({
message: this.signupErrorString,
duration: 3000,
position: 'top'
});
toast.present();
});
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,此代码从不调用成功回调,只调用错误处理程序.如果是这样,会导致您在上面的评论中看到的错误.
我的user.signup()方法如下:
signup(accountInfo: any) {
return this.api.post('register', accountInfo).share(); …Run Code Online (Sandbox Code Playgroud) spring ×5
java ×4
spring-boot ×3
spring-mvc ×2
angular ×1
angularjs ×1
architecture ×1
asynchronous ×1
gruntjs ×1
gwt ×1
jhipster ×1
junit ×1
mvp ×1
okta ×1
puremvc ×1
resttemplate ×1
rxjs ×1
saml-2.0 ×1
spring-saml ×1