Как передать пустую переменную в выражение Spring в JSP
Я использую <spring:eval>
тег в JSP:
<spring:eval expression="'today is ' + today" />
куда today
такое java.util.Date. Все работает просто отлично, если переменная today не равна нулю. когда today
ноль, я получаю
org.springframework.expression.spel.SpelEvaluationException: EL1007E:(pos 0): Поле или свойство 'today' не может быть найдено в null org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:243) org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:112) org.springframework.expression.spel.ast. getValueInternal(OpPlus.java:70) org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102) org.springframework.expression.spel.standard.SpelExpression.get:p.jpg () springframework.web.servlet.tags.EvalTag.doEndTag(EvalTag.java:126) org.apache.jsp.WEB_002dINF.views.admin.inbox_jsp._jspx_meth_s_005feval_005f1(inbox_jsp.g.j. admin.inbox_jsp._jspService (inbox_jsp.java:120) org.apache.j asper.runtime.HttpJspBase.service (HttpJspBase.java:70) javax.servlet.http.HttpServlet.service (HttpServlet.java:728) org.apache.jasper.servlet.JspServletWrapper.serava: org. apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service (JspServlet.java:334) javax.servlet.http.HttpServlet.ServletSservice) org.apache.jasper.runtime. Java: 678) org.apache.tiles.request.jsp.JspRequest.doInclude (JspRequest.java:123) org.apache.tiles.request.AbstractViewRequest.dispatch (AbstractViewRequest.java:47) org.apache.tiles.request. render.DispatchRenderer.render (DispatchRenderer.java:45) org.apache.tiles.request.render.ChainedDelegateRenderer.render (ChainedDelegateRenderer.java:68) org.apache.tiles.impl.BasicTilesContai ner.render (BasicTilesContainer.java:259) org.apache.tiles.template.InsertAttributeModel.renderAttribute (InsertAttributeModel.java:188) org.apache.tiles.template.InsertAttributeModel.execute (InsertAttributeache.32.). tiles.jsp.taglib.InsertAttributeTag.doTag (InsertAttributeTag.java:299) org.apache.jsp.WEB_002dINF.views.common.main_002dlayout_jsp._jspx_meth_tiles_005finsertAttribute_005f2(main_002dlayout_jsp.java:243) org.apache.jsp.WEB_002dINF.views.common.main_002dlayout_jsp._jspService(main_002dlayout_jsp.java:103) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet. servlet.JspServletWrapper.service(JspServletWrapper.java:432) org.apache.jasper.servlet. servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tiles.request.servlet.ServletRequest.forward(ServletRequest.java:265) org.apache.tiles.request.servlet.ServletRequest.doForward(ServletRequest.java:228) org.apache.tiles.request.AbstractClientRequest.dispatch(AbstractClientRequest.java:57. или) tile.request.render.DispatchRenderer.render(DispatchRenderer.java:45) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:259) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.jj) 397) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:238) org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:221) org.apache.tiles.renderer.DefinitionRenderer.der(DefinitionRenderer.java:59) org.springframework.web.servlet.view.tiles3.TilesView.renderMergedOutputModel(TilesView.java:145) org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:264) org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1208) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:992) org.springframework.web.servlet.DispatcherServlet. servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827) javax.servlet.http.HttpServlet.serwork: orv.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.springframework.orm.hibernate4.support. org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.work. FilterSecurityInterceptor.invoke(фильтры ecurityInterceptor.java:118) org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) org.springframework.security.web. springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(SessionManagementFilter.java:103) org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.authentication.Ailil.Aheonymous springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) org.springframework.security.web.FilterChainProxy$VirtualFilterChain..springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:342) org.springframework.security.web.authentication.www.BasicAuthenticationFilter. $ VirtualFilterChain.doFilter (FilterChainProxy.java:342) org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.) org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) org.springframework.security.web.FilterChainProxy$VirtualFilterChain. 342) org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) org.springframework.security.web. DelegatingFilterProxy.java:346) org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
Поэтому я попытался проверить нулевое значение с помощью оператора Элвиса:
<spring:eval expression="'today is ' + (today ?: 'null date!') " />
но это дает точно такое же выражение. После того, как я вошел в код Spring PropertyOrFieldReference с помощью отладчика, я обнаружил, что он не может обрабатывать нулевые переменные.
Простой старый код JSTL обрабатывает ноль, ничего не печатая, что нормально:
today is ${today}
Он также отлично работает от SPeL, если today
это свойство бобов:
<spring:eval expression="'today is ' + myBean.today" />
В результате получается строка "сегодня равно нулю", как и ожидалось. В этом тривиальном примере я мог бы использовать JSTL для разветвления <spring:eval>
тег, когда переменная равна нулю, но мне действительно нужно иметь возможность использовать <spring:eval>
выполнить статическую функцию, которая имеет несколько переменных, любая из которых может на законных основаниях быть нулевой. Проблема в том, что SPeL не может правильно разрешить переменную, если она пуста.
1 ответ
EL в порядке. Сфера неясна. Весна даже не могу найти переменную.
Используйте это для запроса.
<spring:eval expression="'today is ' + requestScope['today']" />
Используйте это для Session Scope:
<spring:eval expression="'today is ' + sessionScope['today']" />