Как передать пустую переменную в выражение 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']" />
Другие вопросы по тегам