- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意以前已将其标记为已回答,但是随着我对基本组件的理解得到了改善,我看到我们的最初答案仅解决了空指针,但未解决根本原因。目前,根本原因似乎是缺少对分发侦听器和附加到容器的dwrServlet上上下文的可见性。
更新解决方案仍然难以捉摸,但是由于以下几个原因,我决定放弃DWR:自从上一次DWR更新以来,Spring和Jquery提供了合适的替代品已经很久了,并且最近进行了维护,从而消除了我们对DWR的依赖将简化我们的项目。仅在这一点上,这个问题仅出于学术目的。
强制性地提到我花了一些时间来研究它。怜悯
我相信我的设置是正确的,但显然我缺少一些关键的东西,我认为现在该是寻找第二组眼睛的时候了。
问题总结
当通过DWR调用的控制器方法访问它们时,我的bean为空。
详细问题描述
使用Spring 4.3.0.RELEASE版本和Direct Web Remoting(org.directwebremoting.dwr)3.0.2-RELEASE版本;
包com.mytest.beans中定义的给定bean,其中仅包含包含字符串(beanName)的字段,
在SpringWebConfig中以@Bean表示法建立(使用所有Java表示法进行Srping,那里没有xml-仅在dwr中使用xml),
并在com.mytest.controller中定义的控制器中与@Autowired自动连接,该控制器被注释为@RemoteProxy,名称为“ SController”,
注释@Controller和注释@RequestMapping的值为“ / dwr / *”,其中包含一个名为getBeanName的方法@RemoteMethod,该方法调用自动装配的实例sbean.beanName
为自动装配的实例抛出null异常。
尝试过的事情
在此示例中,我消除了错误实例化bean的可能性,这是@Autowired的已知问题。我还小心地确保将bean注释为@Component,这是bean无法显示的另一个可能原因。我将dwr的加载顺序设置为2,以便首先加载应用程序上下文,希望确保一切正常,这确实允许我访问dwr index.html以进行测试和调试。
我也尝试将以下行添加到AppInitializer:
dwr.setInitParameter("classes","com.mytest.bean.SBean, com.mytest.controller.SController");
package com.mytest.config;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class AppInitializer implements WebApplicationInitializer {
private Logger logger = LoggerFactory.getLogger(AppInitializer.class);
public void onStartup(ServletContext container) throws ServletException {
try {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringWebConfig.class);
ctx.setServletContext(container);
container.addListener(new ContextLoaderListener(ctx));
container.addListener(new RequestContextListener());
logger.info("Created AnnotationConfigWebApplicationContext");
ServletRegistration.Dynamic dispatcher = container.addServlet("spring-mvc-dispatcher", new DispatcherServlet(ctx));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
logger.info("DispatcherServlet added to AnnotationConfigWebApplicationContext");
ServletRegistration.Dynamic servlet = container.addServlet("login", new com.mycompany.ad.UserLoginServlet());
servlet.setLoadOnStartup(1);
servlet.addMapping("/login/*");
logger.info("UserLoginServlet added to AnnotationConfigWebApplicationContext");
ServletRegistration.Dynamic dwr = container.addServlet("dwr", new org.directwebremoting.servlet.DwrServlet());
dwr.setInitParameter("debug", "true");
dwr.setLoadOnStartup(2);
dwr.addMapping("/dwr/*");
logger.info("DWR Servlet Mapping Created");
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
}
}
}
package com.mytest.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.directwebremoting.annotations.DataTransferObject;
import org.directwebremoting.annotations.GlobalFilter;
import org.directwebremoting.annotations.RemoteProxy;
import org.directwebremoting.extend.Configurator;
import org.directwebremoting.spring.DwrClassPathBeanDefinitionScanner;
import org.directwebremoting.spring.DwrController;
import org.directwebremoting.spring.DwrHandlerMapping;
import org.directwebremoting.spring.SpringConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.mytest"})
@PropertySource(value = { "classpath:application.properties" })
public class SpringWebConfig extends WebMvcConfigurerAdapter {
private Logger logger = LoggerFactory.getLogger(SpringWebConfig.class);
@Bean
public DwrController dwrController(ApplicationContext applicationContext){
logger.info("Starting dwrController Bean");
BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry)applicationContext.getAutowireCapableBeanFactory();
Map<String,String> configParam = new HashMap<String, String>();
logger.info("Configuring scanners for DWR Bean");
ClassPathBeanDefinitionScanner scanner = new DwrClassPathBeanDefinitionScanner(beanDefinitionRegistry);
scanner.addIncludeFilter(new AnnotationTypeFilter(RemoteProxy.class));
scanner.addIncludeFilter(new AnnotationTypeFilter(DataTransferObject.class));
scanner.addIncludeFilter(new AnnotationTypeFilter(GlobalFilter.class));
scanner.scan("com.mytest.bean");
logger.info("Instantiating DwrController instance");
DwrController dwrController = new DwrController();
dwrController.setDebug(true);
dwrController.setConfigParams(configParam);
logger.info("Setting up SpringConfigurator for dwrController");
SpringConfigurator springConfigurator = new SpringConfigurator();
List<Configurator> configurators = new ArrayList<Configurator>();
configurators.add(springConfigurator);
dwrController.setConfigurators(configurators);
logger.info("dwrController ready.");
return dwrController;
}
@Bean
public BeanNameUrlHandlerMapping beanNameUrlHandlerMapping(){
logger.info("Setting up beanNameUrlHandlerMapping");
BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping();
logger.info("beanNameUrlHandlerMapping ready.");
return beanNameUrlHandlerMapping;
}
@Bean
public DwrHandlerMapping dwrHandlerMapping(DwrController dwrController){
logger.info("Setting up dwrHandlerMapping");
Map<String,DwrController> urlMap = new HashMap<String, DwrController>();
urlMap.put("/dwr/**/*",dwrController);
DwrHandlerMapping dwrHandlerMapping = new DwrHandlerMapping();
dwrHandlerMapping.setAlwaysUseFullPath(true);
dwrHandlerMapping.setUrlMap(urlMap);
logger.info("dwrHandlerMappying ready.");
return dwrHandlerMapping;
}
@Bean(name="sBean")
public SBean sBean() {
logger.info("SBean starting");
return new SBean();
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
logger.info("DefaultServletHandlerConfigurer enabled");
}
@Override
public void addInterceptors(InterceptorRegistry registry){
// not using an interceptor
}
}
package com.mytest.controller;
import javax.servlet.http.HttpSession;
import org.directwebremoting.annotations.RemoteMethod;
import org.directwebremoting.annotations.RemoteProxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.mytest.bean.SBean;
@RemoteProxy(name="SController")
@Controller
@RequestMapping("/dwr/*")
public class SController {
private static final Logger logger = LoggerFactory.getLogger(SController.class);
@Autowired
SBean sbean;
@RemoteMethod
@RequestMapping("getBeanName")
@ResponseBody public String getBeanName() {
try {
return sbean.beanName;
}
catch(Exception e) {
logger.error(e.getLocalizedMessage(),e);
return "Error!";
}
}
}
package com.mytest.bean;
import org.springframework.stereotype.Component;
@Component
public class SBean {
public String beanName="Sean";
}
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 3.0//EN" "dwr30.dtd">
<dwr>
<allow>
<create creator="new" javascript="SController" scope="script">
<param name="class" value="com.mytest.controller.SController"/>
</create>
<convert converter="bean" match="java.lang.Throwable"/>
<convert converter="bean" match="java.lang.StackTraceElement"/>
<convert match="com.mytest.bean.SBean" converter="bean"/>
</allow>
</dwr>
最佳答案
正如我告诉您的那样,关键是您使用的是DWR Servlet,而不是spring servlet。为了解决第一个问题,您必须使用DWR提供的弹簧支撑,如在此链接中所见http://directwebremoting.org/dwr/documentation/server/integration/spring.html
关于第二个问题(404错误),我认为这与以下事实有关:自从删除dwr servlet之后,您现在只有/dwr/Sean
路径。
尝试使用/dwr/Sean
而不是dwr/dwr/Sean
路径
安杰洛
关于java - Controller 中的Spring WebMvcConfigurerAdapter,WebApplicationInitializer和DWR空bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49755428/
DWR 是一个死的项目吗?它似乎没有在积极开发中。最新的 3.0 版本似乎停滞不前。我特别想知道是否会有 DWR 1.x 或 2.x 的维护版本,或者是否会发布 3.0。 顺便提一句。我在其中一个 D
我是 DWR 的初学者。根据 (http://directwebremoting.org/dwr-demo/simple/text.html) 中的教程,我将 dwr 脚本放置在我的 html 文件中
我只允许使用 DWR 2.0.5,因为 DWR 3 尚未发布。我的服务器是 8.0。 我有 2 个 URLS Page1 和 Page 2。Page1 将有一个简单的标签和一个空的文本框。 Page2
我目前使用 DWR 2 进行开发,但我现在想尝试 DWR 3。我不明白如何用 DWR 3 制作 cometd 。我在 Google 上搜索了很多次,但没有找到任何好的例子。有人可以帮助我吗? 最佳答案
环境 Websphere 8.5.5.11 JDK 1.8 DWR SpringMVC Oracle DBMS 我们最近升级了我们的项目,并进行了更新 spring.jar, spring-web.j
我正在使用 DWR,这是我相当新的...我使用 ajax 向页面提交评论,我收到请求查看提交评论时是否可以显示 tmestamp: 简而言之,该 bean 有一个称为可审计的变量...在到达数据库之前
是否可以上传文件,然后在收到响应时下载文件, 我的意思是在一个请求中我将上传一个文件并在一个操作中下载该文件? 最佳答案 也许这个演示代码会对您有所帮助: http://directwebremoti
当我登录到我的 webapp dwr 时开始执行,然后生成此错误日志: 18-11-2009 12:09:13 [http-8080-Processor24] ERROR org.directwebr
我是 DWR World 的新手,在理解应用程序的正确行为方面遇到一些问题。 我有这样的情况: 文件 dwr.xml 在我的 html 页面
我从网站上复制了示例,但它不起作用,谁能告诉我原因是什么。我在 tomcat 的控制台日志中没有收到任何异常或错误。 下面是我的文件dwrtest.jsp DIRECT
我正在开发一个 Java Web 应用程序,它在很多地方使用了 DWR。我添加了一个新的 DWR 组件,该组件不得将任何错误传播回最终用户。目前,如果出现服务器端错误,则会在弹出窗口中显示给用户,我想
我希望 DWR 透明地批处理在处理同一事件过程中完成的所有远程调用。 原因是在 Javascript 中处理一个事件必须只需要很短的时间,并且在同一时间内不能发生任何其他事情。因此,如果我要进行许多调
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
大家好,我正在使用 dwr 处理 java-servlet 中的 ajax 调用, 这是我的dwr.xml,
我已经使用 DWR 和转换器有一段时间了,我真的很想将我的 Java 类映射到 JavaScript 类。使用 DWR 转换器,我可以选择指出给定 Java 类的 JS 构造函数的名称。到目前为止一切
我正在使用 dwr 发送和获取一些信息,但出现以下错误。 service(DwrSampleTest) is not defined 当我尝试使用以下行查看文件时: http://localhost:
我试图在我的 DWR 方法调用中捕获并处理 NullPointerException 的返回: CompaniesByCountyFactory.getElementCompanies(command
我想申请一个项目类别的集合(具体反射(reflect))。但是关于类型删除似乎是不可能的,而且关于我在堆栈上阅读过的一些主题。有一些解决方法(here),但我很好奇是否有人知道它是如何完成的,例如 D
我正在尝试编写一个带有直接 Web 远程处理的示例程序。浏览网站http://directwebremoting.org/有一些基本的问题。请帮助我 试用什么程序http://directwebrem
我有一个关联数组。我希望能够使用关联数组键作为选项值,使用数组键作为选项元素的文本,将选项添加到下拉列表中。 var associativeArray = new Array(); associa
我是一名优秀的程序员,十分优秀!