考虑以下控制器方法:
@RequestMapping(value = "/test", method = RequestMethod.GET)
public void test(@RequestParam(value = "fq", required = false) String[] filterQuery) {
logger.debug(fq = " + StringUtils.join(filterQuery, "|"));
}
Run Code Online (Sandbox Code Playgroud)
以下是不同fq组合的输出:
/test?fq=foo 结果是 fq = foo /test?fq=foo&fq=bar 结果是 fq = foo|bar /test?fq=foo,bar 结果是 fq = foo|bar /test?fq=foo,bar&fq=bash 结果是 fq = foo,bar|bash /test?fq=foo,bar&fq= 结果是 fq = foo,bar|例3是问题.我希望(想要/需要)它输出fq = foo,bar.
我已经尝试用逗号来逃避逗号\并使用其他%3C工作.
如果我看一下HttpServletRequest对象的版本:
String[] fqs = request.getParameterValues("fq");
logger.debug(fqs = " + StringUtils.join(fqs, "|"));
Run Code Online (Sandbox Code Playgroud)
它打印预期的输出:fqs = foo,bar …
我正在使用Spring MVC(3.0)和注释驱动的控制器.我想为资源创建REST-ful URL,并且不能要求(但仍然可选地允许)URL末尾的文件扩展名(但如果没有扩展名,则假定为HTML内容类型).只要文件名部分没有点(句点/句号),这就可以与Spring MVC一起开箱即用.
但是,我的某些网址需要名称中带有点的标识符.像这样:
http://company.com/widgets/123.456.789.500
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Spring会查找扩展的内容类型,.500并找不到任何错误.我可以使用解决方法,如添加.html到最后,编码标识符或添加尾部斜杠.我对这些不满意,但可能会加入.html.
我没有成功地寻找一种覆盖Spring中默认文件扩展名检测的方法.
是否可以为给定的控制器方法或URL模式等自定义或禁用文件扩展名检测?
我有一个使用Maven构建的Spring-MVC 3.0 Web应用程序.所有Spring依赖版本都使用maven属性定义<spring.version>3.0.3.RELEASE</spring.version>.当我将版本更改为3.0.4.RELEASE或者3.0.5.RELEASE,然后Web应用程序失败,并出现以下异常:
ERROR: [DispatcherServlet] - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping#0': Initialization of bean failed; nested exception is java.lang.NoSuchFieldError: USER_DECLARED_METHODS
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:442)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:458)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:339)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:306)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:127)
at javax.servlet.GenericServlet.init(GenericServlet.java:241)
at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:433)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:39)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:612)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:139)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1220)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:510)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:448)
at org.mortbay.jetty.plugin.Jetty6PluginWebAppContext.doStart(Jetty6PluginWebAppContext.java:110)
at …Run Code Online (Sandbox Code Playgroud) 我有一个Spring-MVC webapp(3.0.5-RELEASE),它需要从另一个子域(通过AJAX从客户端/浏览器)访问另一个webapp的JSON webservices.
我过去通过以下方式解决了这个问题:
编写一个代理请求的简单控制器,使用Apache Commons HttpClient处理请求.因此,克服了大多数浏览器的跨站点/跨源请求安全限制
在服务器端实现JSONP服务(在调用我们自己的JSON服务时) - 并非总是可行
在JSONP不可能的情况下,是否有更好的方法(1.)?
和/或
有没有一个库可以为我处理这个?所以我不必HttpClient自己编写所有代码 - 它不是很多代码,但我想知道我是否(非常)重新发明了这个轮子.
在Spring MVC 3.x中,我可以ContentNegotiatingViewResolver通过将文件扩展名更改为.json或者,将bean 配置为自动呈现JSON或XML中的任何给定端点.xml.我假设Grails中有相同的功能但我找不到它.
我读过的所有内容都说我必须捕获传入的mime类型(使用withFormat),然后render as JSON在我的每个控制器方法中使用(或等效)指定JSON输出(例如,使用Grails渲染JSON?).在我深入研究并开始向控制器添加JSON特定代码之前,我想我会问这里......
所以我的问题是:我是否可以通过简单地为任何给定的URL添加".json"文件扩展名(或更改接受标头)来配置Grails 2来自动生成JSON输出?
我正在尝试添加自定义GORM事件侦听器类Bootstrap.groovy,如Grails文档中所述,但它不适用于我.以下是直接来自文档的代码:
def init = {
application.mainContext.eventTriggeringInterceptor.datastores.each { k, datastore ->
applicationContext.addApplicationListener new MyPersistenceListener(datastore)
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行它时,编译器会抱怨application和applicationContext为null.我已经尝试将它们添加为类级别成员,但它们没有神奇的有线服务风格.我到目前为止最接近的是:
def grailsApplication
def init = { servletContext ->
def applicationContext = servletContext.getAttribute(ApplicationAttributes.APPLICATION_CONTEXT)
grailsApplication.mainContext.eventTriggeringInterceptor.datastores.each { k, datastore ->
applicationContext.addApplicationListener new GormEventListener(datastore)
}
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到错误:java.lang.NullPointerException: Cannot get property 'datastores' on null object.
谢谢阅读...
编辑:版本2.2.1
spring ×4
spring-mvc ×4
java ×3
grails ×2
ajax ×1
data-binding ×1
grails-orm ×1
json ×1
maven-2 ×1
mongodb ×1
proxy ×1
rest ×1