org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: класс 'java.lang.String' не имеет свойства 'user' - PullRequest
0 голосов
/ 07 марта 2019

Я работаю с пружинным веб-потоком
Моя страница JSP

<!-- header -->
<%@include file="../shared/flows-header.jsp"%>

<div class = "container">


<div class = "row">

<div class = col-sm-6>

    <div class = "panel panel-primary">

        <div class = "panel-heading">

            <h4>Personal Details</h4>

        </div>

        <div class = "panel-body">

            <!-- to display personal details -->
                    <div class="text-center">
                        <h3>Name : <strong>${registerModel.user.firstname} ${registerModel.user.lastname}</strong></h3>
                        <h4>Email : <strong>${registerModel.user.email}</strong></h4>
                        <h4>Contact : <strong>${registerModel.user.contactNumber}</strong></h4>
                        <h4>Role : <strong>${registerModel.user.role}</strong></h4>

                    </div>

                    <!-- anchor tag to move to personal details page to edit -->
                    <p>
                        <a href = "${flowExecutionUrl}&_eventId_personal" class = "btn btn-primary">Edit</a>        
                    </p>
        </div>

    </div>

</div>


<div class = col-sm-6>

    <div class = "panel panel-primary">

        <div class = "panel-heading">

            <h4>Billing Address</h4>

        </div>

        <div class = "panel-body">

            <!-- to display billing address -->
                    <div class="text-center">
                        <p>${registerModel.billing.addressLineOne}, </p>
                        <p>${registerModel.billing.addressLineTwo}, </p>
                        <p>${registerModel.billing.city} -  ${registerModel.billing.postalCode}, </p>
                        <p>${registerModel.billing.state}</p>
                        <p>${registerModel.billing.country}</p>
                    </div>      

            <!-- anchor tag to move to billing address page to edit -->
            <p>
                <a href = "${flowExecutionUrl}&_eventId_billing" class = "btn btn-primary">Edit</a>
            </p>

        </div>

    </div>

</div>

<div class = "row">

    <div class = "col-sm-4 col-sm-offset-4">

        <div class = "text-center">

            <!-- anchor tag to move to success page -->
            <a href = "${flowExecutionUrl}&_eventId_submit" class = "btn btn-primary">Confirm Submission</a>

        </div>

    </div>

</div>

</div>

</div>

<!-- footer -->
<%@include file="../shared/flows-footer.jsp"%>

Моя страница signup-flow.xml

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow.xsd">

    <var  name = "user" class = "model.entity.User" />
    <var  name = "billing" class = "model.entity.Address" />

    <on-start>
        <evaluate expression="'registerHandler.init()'" result = "flowScope.registerModel" />
    </on-start>


    <!-- start state -->
    <view-state id = "personal" view = "flows/register/signup-personal" model = "'user'"><!-- model value is used as modelAttribute in spring form -->
        <transition on = "billing" to = "billing" /><!-- to billing view state -->
        <on-exit>
            <evaluate expression="'registerHandler.addUser(flowScope.registerModel , user)'" />
        </on-exit>
     </view-state>

    <view-state id = "billing" view = "flows/register/signup-billing" model = "'billing'">
        <transition on = "personal" to = "personal" />
        <transition on = "confirm" to = "confirm" />
        <on-exit>
            <evaluate expression="'registerHandler.addBilling(flowScope.registerModel , billing)'" />
        </on-exit>
     </view-state>

    <view-state id = "confirm" view = "flows/register/signup-confirm" model = "flowScope.registerModel">
        <transition on = "personal" to = "personal" />
        <transition on = "billing" to = "billing" />
        <transition on = "submit" to = "submit" />  
     </view-state>

    <action-state id="submit">
        <evaluate expression="'registerHandler.saveAll(flowScope.registerModel)'" />
        <transition on = "success" to = "success" />
    </action-state>

    <!-- end state -->
    <end-state id = "home" view = "externalRedirect:contextRelative:/" />
    <end-state id = "success" view = "flows/register/signup-success" />


    <!-- global transition -->
    <global-transitions>
        <transition on = "home" to = "home"/>
    </global-transitions>

</flow>

** Трассировка стека ошибок **

ОШИБКА [io.undertow.request] (задание по умолчанию-5) UT005023: Запрос обработки исключения в / OnlineShoppingFE/views/flows/register/signup-confirm.jsp: org.springframework.web.util.NestedServletException: обработка запроса не удалась;вложенное исключение - org.springframework.webflow.execution.FlowExecutionException: исключение, генерируемое в состоянии «подтверждение» потока, «регистр» в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:1006) в org.spring.servlet.FrameworkServlet.javax.servlet.http.HttpServlet.service (HttpServlet.java:790) в io.undertow.servlet.handlers.ServletHandler.handleRequest (ServletHandler.java:74) в io.undertow.servlet.handlers.security.ShlerServletSecurityRoleHandler.java:62) в io.undertow.servlet.handlers.ServletChain $ 1.handleRequest (ServletChain.java:68) в io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest (Servlet.extension.undertow.security.SecurityContextAssociationHandler.handleRequest (SecurityContextAssociationHandler.java:78) по адресу io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:43) по адресу io.undertow.servlet.handlers.security.SSLInformationAssociationHquer (SSL): Handhield (SSL)по адресу io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest (ServletAuthenticationCallHandler.java:57) по адресу io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.jo).Ручной запросio.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest (CachedAuthenticatedSessionHandler.java: 77) по адресу io.undertow.security.handlers.NotificationReceiverHandler.handleRequest (NotificationReceiverHandler.java:50) по адресу io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest (AbstractSecurityConunder.tj).Обработчики.Java: 43) в org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest (GlobalRequestControllerHandler.java:68) в io.undertow.server.handlers.PredicateHandler.handleRequest (Predicateservwand).handlers.ServletInitialHandler.handleFirstRequest (ServletInitialHandler.java:292) в io.undertow.servlet.handlers.ServletInitialHandler.access $ 100 (ServletInitialHandler.java:81) в io.undertow.servlet.s.ServletInitialHandler $ 2.call (ServletInitialHandler.java:138) в io.undertow.servlet.handlers.ServletInitialHandler $ 2.call (ServletInitialHandler.java:135) в iounder.west.: 48) вio.undertow.servlet.core.ContextClassLoaderSetupAction $ 1.call (ContextClassLoaderSetupAction.java:43) в org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda $ создать $ 0 (SecurityContextThreadSetupAction.java:105) в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ создать $ 0 (UndertowDeploymentInfoService.java:1514) в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ создать $ 0 (UndertowDeploymentInfoService.java:1514) в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ создать $ 0 (UndertowDeploymentInfoService.java:1514) в org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ создать $ 0 (UndertowDeploymentInfoService.java:1514) в io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest (ServletInitialHandler.java:272) в io.undertow.servlet.handlers.ServletInitialHandler.access $ 000 (ServletInitialHandler.java:81) в io.undertow.servlet.handlers.ServletInitialHandler $ 1.handleRequest (ServletInitialHandler.java:104) в io.undertow.server.Connectors.executeRootHandler (Connectors.java:360) в io.undertow.server.HttpServerExchange $ 1.run (HttpServerExchange.java:830) в org.jboss.threads.ContextClassLoaderSavingRunnable.run (ContextClassLoaderSavingRunnable.java:35) в org.jboss.threads.EnhancedQueueExecutor.safeRun (EnhancedQueueExecutor.java:1985) в org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.doRunTask (EnhancedQueueExecutor.java:1487) в org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.run (EnhancedQueueExecutor.java:1378) at java.lang.Thread.run (Неизвестный источник) Причина: org.springframework.webflow.execution.FlowExecutionException: Исключение выдается в состоянии «подтверждение» потока «регистр» в org.springframework.webflow.engine.impl.FlowExecutionImpl.wrap (FlowExecutionImpl.java:573) в org.springframework.webflow.engine.impl.FlowExecutionImpl.resume (FlowExecutionImpl.java:263) в org.springframework.webflow.executor.FlowExecutorImpl.resumeExecution (FlowExecutorImpl.java:169) в org.springframework.webflow.mvc.servlet.FlowHandlerAdapter.handle (FlowHandlerAdapter.java:253) в org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:1038) в org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:942) в org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:998) ... еще 45 Причина: java.lang.IllegalStateException: Exception Произошло представление рендеринга org.springframework.web.servlet.view.JstlView: имя «потоки / регистр / регистрация-подтверждение»; URL [/views/flows/register/signup-confirm.jsp] в org.springframework.webflow.mvc.view.AbstractMvcView.render (AbstractMvcView.java:200) в org.springframework.webflow.engine.ViewState.render (ViewState.java:293) в org.springframework.webflow.engine.ViewState.refresh (ViewState.java:242) в org.springframework.webflow.engine.ViewState.resume (ViewState.java:220) в org.springframework.webflow.engine.Flow.resume (Flow.java:537) в org.springframework.webflow.engine.impl.FlowExecutionImpl.resume (FlowExecutionImpl.java:259) ... еще 50 причин: org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: класс 'java.lang.String' делает не имеет свойства 'user'. в org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java:473) в org.apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:403) в org.apache.jasper.servlet.JspServlet.service (JspServlet.java:347) в javax.servlet.http.HttpServlet.service (HttpServlet.java:790) в io.undertow.servlet.handlers.ServletHandler.handleRequest (ServletHandler.java:74) вio.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest (ServletSecurityRoleHandler.java:62) в io.undertow.jsp.JspFileHandler.handleRequest (JspFileHandler.java:32) в io.undertow.servlet.handlers.ServletChain $ 1.handleRequest (ServletChain.java:68) в io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest (ServletDispatchingHandler.java:36) в io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:43) в io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:43) в io.undertow.server.handlers.PredicateHandler.handleRequest (PredicateHandler.java:43) в io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest (ServletInitialHandler.java:274) в io.undertow.servlet.handlers.ServletInitialHandler.dispatchToPath (ServletInitialHandler.java:209) в io.undertow.servlet.spec.RequestDispatcherImpl.forwardImpl (RequestDispatcherImpl.java:221) в io.undertow.servlet.spec.RequestDispatcherImpl.forwardImplSetup (RequestDispatcherImpl.java:147) в io.undertow.servlet.spec.RequestDispatcherImpl.forward (RequestDispatcherImpl.java:111) в org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel (InternalResourceView.java:170) в org.springframework.web.servlet.view.AbstractView.render (AbstractView.java:316) в org.springframework.webflow.mvc.servlet.ServletMvcView.doRender (ServletMvcView.java:55) в org.springframework.webflow.mvc.view.AbstractMvcView.render (AbstractMvcView.java:196) ... еще 55 Вызвано: javax.el.PropertyNotFoundException: класс 'java.lang.String' не имеет свойства 'user'. в javax.el.BeanELResolver.getBeanProperty (BeanELResolver.java:568) в javax.el.BeanELResolver.getValue (BeanELResolver.java:229) в org.apache.jasper.el.JasperELResolver.getValue (JasperELResolver.java:110) в com.sun.el.parser.AstValue.getValue (AstValue.java:139) в com.sun.el.parser.AstValue.getValue (AstValue.java:203) в com.sun.el.ValueExpressionImpl.getValue (ValueExpressionImpl.java:226) в org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate (PageContextImpl.java:917) в org.apache.jsp.views.flows.register.signup_002dconfirm_jsp._jspService (signup_002dconfirm_jsp.java:230) в org.apache.jasper.runtime.HttpJspBase.service (HttpJspBase.java:70) в javax.servlet.http.HttpServlet.service (HttpServlet.java:790) в org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java:433) ... еще 75

Класс RegisterModel равен

package flow.model;

import java.io.Serializable;

import model.entity.Address;
import model.entity.User;

public class RegisterModel implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private User user;

    private Address billing;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public Address getBilling() {
        return billing;
    }

    public void setBilling(Address billing) {
        this.billing = billing;
    }


}

RegisterHandler класс

package handler;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import flow.model.RegisterModel;
import model.dao.IUserDAO;
import model.entity.Address;
import model.entity.Cart;
import model.entity.User;

@Component
public class RegisterHandler {

    @Autowired
    private IUserDAO userDAO;

    public RegisterModel init()
    {
        System.out.println(new RegisterModel().toString());
        return (new RegisterModel());
    }

    public void addUser(RegisterModel registerModel,User user)
    {
        registerModel.setUser(user);
    }

    public void addBilling(RegisterModel registerModel,Address billing)
    {
        registerModel.setBilling(billing);
    }

    public String saveAll(RegisterModel model)
    {
        String transitionValue = "success";

        //fetch user
        User user = model.getUser();

        if(user.getRole().equals("ROLE"))
        {
            Cart cart = new Cart();
            cart.setUser(user);
            user.setCart(cart);
        }

        //save user
        userDAO.addUser(user);

        //get address
        Address billing = model.getBilling();   
        billing.setUserId(user.getId());
        billing.setBilling(true);

        //save the address
        userDAO.addAddress(billing);

        return transitionValue;
    }

}

1 Ответ

1 голос
/ 08 марта 2019

Я вижу там несколько возможных недоразумений, но я думаю, что главное состоит в том, что вы используете одинарные кавычки вокруг атрибутов, которые вы не должны. Причиной этой конкретной проблемы является:

<evaluate expression="'registerHandler.init()'" result = "flowScope.registerModel" />

Вы помещаете в flowScope.registerModel значение String "registerHandler.init ()", а не результаты вызова registerHandler.init().

Вместо этого удалите одинарные кавычки следующим образом:

<evaluate expression="registerHandler.init()" result = "flowScope.registerModel" />

То же самое для более поздних ссылок, таких как:

   <view-state id = "billing" view = "flows/register/signup-billing" model = "'billing'">

Здесь также не должно быть одинарных кавычек вокруг "биллинга":

   <view-state id = "billing" view = "flows/register/signup-billing" model = "billing">

(Кроме того, объявив <var> s «пользователь» и «выставление счетов», они автоматически помещаются в область действия потока, так что вы можете ссылаться на них в JSP непосредственно как ${user.firstname}.)

...