Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> #springBind выкидывает ошибку. Только в одной из форм... 
:(
    Опции темы
ShurikA
Дата 16.11.2009, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Есть контроллер:
Код

@Controller("employeePositionController")
public class EmployeePositionCtrl {

    @Autowired
    private EmployeeConfigService employeeConfigService;
    /**
     * Validator
     */
    private EmployeePositionFormValidator epfValidator = null;

    @RequestMapping(value = "/emplPoses", method = RequestMethod.GET)
    public ModelAndView showEmployeePositionsList() {
        ModelAndView mv = new ModelAndView("config/empl/employeePositionsList");
        //get all available employee positions
        List<EmployeePosition> emplPoses = employeeConfigService.getAllEmployeePositions();

        //add to view
        mv.addObject("emplPoses", emplPoses);

        return mv;
    }

    /**
     * Shows employee position form
     * @param epId
     * @return
     */
    @RequestMapping(value = "/emplPos.form", method = RequestMethod.GET)
    public ModelAndView showEmployeePositionForm(@RequestParam(value = "epId", required = false) Integer epId) {
        EmployeePositionFormCommand epfComm = new EmployeePositionFormCommand();
        if (epId != null) {
            EmployeePosition epObj = employeeConfigService.findEmployeePositionById(epId);
            if (epObj instanceof EmployeePosition) {
                epfComm.setEmplPosId(epObj.getId());
                epfComm.setDescription(epObj.getDescription());
                epfComm.setActive(epObj.getActive());
            } else {
                return new ModelAndView(new RedirectView("emplPoses"));
            }
        }
        return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", epfComm);
    }

    /**
     * Processes Employee position form
     * @param epfComm
     * @param br
     * @return
     */
    @RequestMapping(value = "/emplPos.form", method = RequestMethod.POST)
    public ModelAndView processEmployeePositionForm(EmployeePositionFormCommand epfComm, BindingResult br) {
        if (this.epfValidator == null) {
            this.epfValidator = new EmployeePositionFormValidator();
        }
        this.epfValidator.validate(epfComm, br);
        if (br.hasErrors()) {
            return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());
        }
        SystemUser su = (SystemUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String redUrl = "";
        EmployeePosition epObj = null;
        try {
            if (epfComm.getEmplPosId() instanceof Integer && epfComm.getEmplPosId() > 0) {
                //update existing
                epObj = employeeConfigService.updateEmployeePosition(epfComm.getEmplPosId(), epfComm.getDescription(), epfComm.getActive(), su);
                redUrl = "emplPos.form?epId=" + epObj.getId();
            } else {
                //create new
                epObj = employeeConfigService.createEmployeePosition(epfComm.getDescription(), epfComm.getActive(), su);
                redUrl = "emplPoses";
            }
        } catch (DuplicateEmployeePositionException depe) {
            Logger.getLogger(getClass().getName()).log(Level.INFO, "Such EmployeePosition exists!", depe);
            br.rejectValue("description", "employee.config.pos.description.duplicate", "Duplicate employee position!");
            return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());
        }
        return new ModelAndView(new RedirectView(redUrl));
    }

    /**
     * Binders
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, true));
        binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor("on", null, true));
    }
}


и фаблон формы:
Код

<p><a href="emplPoses">Back to Employee Positions list</a></p>
#foreach($error in $status.errorMessages) <span style="color:red;"><b>$error</b></span> <br> #end
<form action="" method="POST" commandName="emplPosFormCommand">
<p>
    #springBind( "emplPosFormCommand.emplPosId" )
    #if ($!status.value)
        <input type="hidden" name="${status.expression}" id="${status.expression}" value="$!status.value"/>
    #end

    #springBind( "emplPosFormCommand.description" )
    <label for="${status.expression}">#springMessage("employee.config.label.employee_position") </label>
    <input type="text" id="${status.expression}" name="${status.expression}" value="$!status.value" />
    #foreach($error in $status.errorMessages) <span style="color:red;">$error</span> #end<br/>

    #springBind( "emplPosFormCommand.active" )
    <label for="${status.expression}">#springMessage("employee.config.label.is_active") </label>
    <input type="checkbox" id="${status.expression}" name="${status.expression}"#if($!{status.value}=="on") checked="checked"#end/>
    #foreach($error in $status.errorMessages) <span style="color:red;">$error</span> #end<br/>
</p>
<p>
    <input type="submit" value="Submit"/>
    <input type="Reset" value="Reset"/>
</p>
</form>


Форма отрисовывается и отрабатывает нормально всегда, кроме одного случая:
Когда, я бытаюсь создать новую запись (EmployeePosition) при этом такова уже сыществует. Я должем вернуться в форму с ошибкой. За это овечает вот этот код:
Код

try {
            if (epfComm.getEmplPosId() instanceof Integer && epfComm.getEmplPosId() > 0) {
                //update existing
                epObj = employeeConfigService.updateEmployeePosition(epfComm.getEmplPosId(), epfComm.getDescription(), epfComm.getActive(), su);
                redUrl = "emplPos.form?epId=" + epObj.getId();
            } else {
                //create new
                epObj = employeeConfigService.createEmployeePosition(epfComm.getDescription(), epfComm.getActive(), su);
                redUrl = "emplPoses";
            }
        } catch (DuplicateEmployeePositionException depe) {
            Logger.getLogger(getClass().getName()).log(Level.INFO, "Such EmployeePosition exists!", depe);
            br.rejectValue("description", "employee.config.pos.description.duplicate", "Duplicate employee position!");
            return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());
        }


но в место этого получаю ексепшен:
Код

SEVERE: Exception in macro #springBind at config/empl/employeePositionForm.vm[line 5, column 5]
SEVERE: StandardWrapperValve[dispatcher]: PWC1406: Servlet.service() for servlet dispatcher threw exception
org.springframework.beans.NotReadablePropertyException: Invalid property 'emplPosId' of bean class [java.util.HashMap]: Bean property 'emplPosId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
        at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:579)
        at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:571)
        at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:147)
        at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:726)
        at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:389)
        at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:378)
...


что я делаю не так. 

P.S. Кстати, у меня есть ещё два контроллера, в которых сделанно таким же образом (для других объектов), и всё работает как часы...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 16.11.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



А вот то что я получяю на Tomcat-e:
Код

org.springframework.web.util.NestedServletException: Method invocation failed during rendering of Velocity view with name 'config/empl/employeePositionForm': Invocation of method 'getBindStatus' in  class org.springframework.web.servlet.support.RequestContext threw exception org.springframework.beans.NotReadablePropertyException: Invalid property 'emplPosId' of bean class [java.util.HashMap]: Bean property 'emplPosId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? at org/springframework/web/servlet/view/velocity/spring.vm[line 88, column 52]; reference [springMacroRequestContext], method 'getBindStatus'; nested exception is org.springframework.beans.NotReadablePropertyException: Invalid property 'emplPosId' of bean class [java.util.HashMap]: Bean property 'emplPosId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    iib.web.view.LayoutVelocityView.mergeTemplate(LayoutVelocityView.java:62)
    iib.web.view.LayoutVelocityView.doRender(LayoutVelocityView.java:46)
    org.springframework.web.servlet.view.velocity.VelocityView.renderMergedTemplateModel(VelocityView.java:290)
    org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1072)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:808)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:726)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:636)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:556)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:344)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:110)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:98)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:95)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:110)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:55)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:36)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:92)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:106)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:108)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:150)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

org.springframework.beans.NotReadablePropertyException: Invalid property 'emplPosId' of bean class [java.util.HashMap]: Bean property 'emplPosId' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
    org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:579)
    org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:571)
    org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:147)
    org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:726)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:389)
    org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:378)
    org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:270)
    org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:252)
    org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:493)
    org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71)
    org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142)
    org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
    org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336)
    org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:106)
    org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72)
    org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:212)
    org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:247)
    org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:175)
    org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:336)
    org.apache.velocity.Template.merge(Template.java:328)
    org.apache.velocity.Template.merge(Template.java:235)
    iib.web.view.LayoutVelocityView.mergeTemplate(LayoutVelocityView.java:56)
    iib.web.view.LayoutVelocityView.doRender(LayoutVelocityView.java:46)
    org.springframework.web.servlet.view.velocity.VelocityView.renderMergedTemplateModel(VelocityView.java:290)
    org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1072)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:808)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:726)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:636)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:556)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:344)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:110)
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:98)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:95)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:110)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:55)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:36)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter.doFilter(DefaultLoginPageGeneratingFilter.java:92)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:106)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:108)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:356)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:150)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)




--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Juggernaut
Дата 16.11.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.12.2005

Репутация: 1
Всего: 2



Судя по тексту ошибки и вот этому коду

Код

epfComm.getEmplPosId() instanceof Integer 


у вас отличаются входной параметр set метода и выходной параметр get метода для свойтва emplPosId


Что-то типа:
Object getEmplPosId() 
void setEmplPosId(Integer id)

Надо привести к одному типу, ИМХО.


PM MAIL   Вверх
ShurikA
Дата 16.11.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Juggernaut
Да вроде нет:
Код

/*
 *  @copyright Copyright © 2005-2009 IIB Solutions Ltd. All rights reserved
 *  @author Alex Agulyansky (ShurikAg), IIB Solutions Ltd. Email: [email protected]
 *  @license
 *  This software cannot be distributed by any authority but IIB Solutions Ltd.
 *  If you have purchased of downloaded this file, please report this to our email above.
 */
package backend.config.employee.command;

/**
 *
 * @author ShurikAg
 */
public class EmployeePositionFormCommand {

    private Integer emplPosId = null;
    private String description = null;
    private Boolean active = null;

    public Boolean getActive() {
        return active;
    }

    public String getDescription() {
        return description;
    }

    public void setActive(Boolean active) {
        this.active = active;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public void setEmplPosId(Integer emplPosId) {
        this.emplPosId = emplPosId;
    }

    public Integer getEmplPosId() {
        return emplPosId;
    }
}




--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Juggernaut
Дата 16.11.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.12.2005

Репутация: 1
Всего: 2



Тогда второе предположение:

Код

return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());


где судя по докам br.getModel() возращает Map

получается, что в форме под именем "emplPosFormCommand" лежит обычная Map, у которой естественно нет никаких методов:

а вот и логи ....
Invalid property 'emplPosId' of bean class [java.util.HashMap]:


PM MAIL   Вверх
ShurikA
Дата 16.11.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Juggernaut @  16.11.2009,  12:48 Найти цитируемый пост)
получается, что в форме под именем "emplPosFormCommand" лежит обычная Map, у которой естественно нет никаких методов

Это я понимаю, но по какой причине это может быть. Так как если форма просто не проходит валидацию, тут:
Код

if (br.hasErrors()) {
            return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());
        }

и грубо говоря делает тоже самое, то всё прекрасно работает. Более того, в двух других местах, я делаю тоже самое с другими формами, и всё ОК.

 smile 


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Juggernaut
Дата 17.11.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.12.2005

Репутация: 1
Всего: 2



Но если все прекрасно работает можно попробовать вынести проверку дублирующихся записей на этап валидации.

Код

        this.epfValidator.validate(epfComm, br);
        this.epfValidator.checkExistingEmployee(epfComm, br);//либо добавить нужную логику в метод validate
        if (br.hasErrors()) {
            return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());
        }


Собственно try-catch убрать, логику вывода сообщения перенести в новый метод.

ИМХО, использование исключений для обработки логики not the pattern way. )))

P.S. Если не сильно сложно я бы хотел глянуть хотя бы один из работающих контроллеров и валидатор.
PM MAIL   Вверх
ShurikA
Дата 17.11.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Juggernaut @  17.11.2009,  11:46 Найти цитируемый пост)
 this.epfValidator.checkExistingEmployee(epfComm, br);//либо добавить нужную логику в метод validate

Но в таком случае мне нужно делать инджекшен DAO класса в валидатор. Я не очень чотел этого делать.


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Juggernaut
Дата 18.11.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.12.2005

Репутация: 1
Всего: 2




А чем плоха Injection в валидатор?

Я в своем проекте делал форму регистрации на Spring, где нужно было как раз проверять на наличие дублирующихся e-mail, nickname и т. д.

Собственно все это дело проверялось методами checkDuplicateXXX в валидаторе посредством заинжектенного сервиса/DAO. 

Тогда даже не знаю....

Выведите в логи содержимое br.getModel в том месте где работает и где нет, посмотрите чего не хватает и ручками добавьте.
Хотя это уже debug и проблему не решает. 

PM MAIL   Вверх
ShurikA
Дата 18.11.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Juggernaut
Буду пробовать с DAO в валидаторе.
И расскажу как было smile



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
ShurikA
Дата 18.11.2009, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Juggernaut @  17.11.2009,  11:46 Найти цитируемый пост)
P.S. Если не сильно сложно я бы хотел глянуть хотя бы один из работающих контроллеров и валидатор. 

Код

package backend.config.employee;

import backend.config.employee.command.EmployeeTypeFormCommand;
import backend.config.employee.command.EmployeeTypeFormValidator;
import iib.exceptions.DuplicateEmployeeTypeException;
import iib.model.auth.SystemUser;
import iib.model.employee.config.EmployeeType;
import iib.service.employee.config.EmployeeConfigService;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

/**
 *
 * @author ShurikAg
 */
@Controller("employeeTypeController")
public class EmployeeTypeCtrl {

    @Autowired
    private EmployeeConfigService employeeConfigService;

    /**
     * Shows a list of all "system" employee types. Not specific for company.
     * @return
     */
    @RequestMapping(value = "/emplTypes", method = RequestMethod.GET)
    public ModelAndView showEmployeeTypesList() {
        ModelAndView mv = new ModelAndView("config/empl/emplTypeList");
        //get all employee types
        List<EmployeeType> emplTypes = this.employeeConfigService.getAllEmployeeTypes();
        //add to view
        mv.addObject("emplTypes", emplTypes);
        return mv;
    }

    /**
     * Shows new/edit employee type form
     * @param etId
     * @return
     */
    @RequestMapping(value = "/emplType.form", method = RequestMethod.GET)
    public ModelAndView showEmployeeTypeForm(@RequestParam(value = "etId", required = false) Integer etId) {
        ModelAndView mv = new ModelAndView("config/empl/employeeTypeForm");
        EmployeeTypeFormCommand etFormCommand = new EmployeeTypeFormCommand();
        //get employee type object
        if (etId != null) {
            EmployeeType et = this.employeeConfigService.findEmployeeTypeById(etId);
            if (et instanceof EmployeeType) {
                etFormCommand.setEmplTypeId(et.getId());
                etFormCommand.setDescription(et.getDescription());
            } else {
                return new ModelAndView(new RedirectView("emplTypes"));
            }
        }
        mv.addObject("employeeTypeFormCommand", etFormCommand);
        return mv;
    }

    /**
     * Processes new/edit employee type form
     * @param etComm
     * @param br
     * @return
     */
    @RequestMapping(value = "/emplType.form", method = RequestMethod.POST)
    public ModelAndView processEmployeeTypeForm(EmployeeTypeFormCommand etComm, BindingResult br) {
        EmployeeTypeFormValidator etFormValidator = new EmployeeTypeFormValidator();
        etFormValidator.validate(etComm, br);
        if (br.hasErrors()) {
            return new ModelAndView("config/empl/employeeTypeForm", br.getModel());
        }
        SystemUser su = (SystemUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String redUrl = "";
        EmployeeType et = null;
        //create new or update
        try {
            if (etComm.getEmplTypeId() instanceof Integer && etComm.getEmplTypeId() > 0) {
                //update existing
                this.employeeConfigService.updateEmployeeType(etComm.getEmplTypeId(), etComm.getDescription(), su);
                redUrl += "emplType.form?etId=" + etComm.getEmplTypeId();
            } else {
                //create new
                et = this.employeeConfigService.createEmployeeType(etComm.getDescription(), su);
                if (et instanceof EmployeeType) {
                    redUrl = "emplTypes";
                }
            }
        } catch (DuplicateEmployeeTypeException ejbE) {
            Logger.getLogger(getClass().getName()).log(Level.INFO, "Such EmployeeType exists!", ejbE);
            br.rejectValue("description", "employee.config.type.description.duplicate", "Duplicate employee type!");
            return new ModelAndView("config/empl/employeeTypeForm", br.getModel());
        }
        return new ModelAndView(new RedirectView(redUrl));
    }

    /**
     * Binders
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, true));
    }
}


Код

package backend.config.employee.command;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

/**
 *
 * @author ShurikAg
 */
public class EmployeeTypeFormValidator implements Validator {

    private static final String EMPLTYPE_REGEXP = "[A-Za-z0-9 _-]{3,}";

    public boolean supports(Class clazz) {
        return EmployeeTypeFormCommand.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
        EmployeeTypeFormCommand comm = (EmployeeTypeFormCommand) target;
        if(!comm.getDescription().trim().matches(EMPLTYPE_REGEXP)){
            errors.rejectValue("description", "employee.config.type.description.not_valid", "Employee type description is not valid!");
        }
    }
}



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Juggernaut
Дата 18.11.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.12.2005

Репутация: 1
Всего: 2



Вот оно:

Так правильно:

Код

 return new ModelAndView("config/empl/employeePositionForm", br.getModel());


а так нет,
Код

 return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());


потому что из исходников спринга в комментах для метода getModel

Return a model Map for the obtained state, exposing an Errors instance as MODEL_KEY_PREFIX + objectName'  and the object itself.

Т.е. HashMap модель ошибок уже содержит в себе командный объект и связанные с ним ошибки.


PM MAIL   Вверх
ShurikA
Дата 18.11.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Juggernaut @  18.11.2009,  11:13 Найти цитируемый пост)
Так правильно:

Выделить всёкод Java
1:
    
 return new ModelAndView("config/empl/employeePositionForm", br.getModel());


а так нет,
Выделить всёкод Java
1:
    
 return new ModelAndView("config/empl/employeePositionForm", "emplPosFormCommand", br.getModel());




Так оно так и было, изначально...
Это потом я уже начал с этим играться и пытаться понять почему не работает.

Но это уже не важно, так как я уже начал переделывать валидатор с инджектом сервиса.
но как обычно, всё не как у людей smile

пока что @Autowire в валидаторе не пашет.

Добавлено через 7 минут и 49 секунд
Код

public class EmployeePositionFormValidator implements Validator {

    @Autowired
    private EmployeeConfigService employeeConfigService;

    private static final String DESCRIPTION_REGEXP = "[A-Za-z0-9 ._-]{3,}";

    public boolean supports(Class clazz) {
        return EmployeePositionFormCommand.class.isAssignableFrom(clazz);
    }

    public void validate(Object target, Errors errors) {
        EmployeePositionFormCommand epfc = (EmployeePositionFormCommand) target;
        if (!epfc.getDescription().trim().matches(DESCRIPTION_REGEXP)) {
            errors.rejectValue("description", "employee.config.pos.description.not_valid", "Entered employee position is not valid!");
        }
        //duplicates
        Boolean isDuplicate = false;
        if(epfc.getEmplPosId() != null){
            isDuplicate = employeeConfigService.isDuplicateEmployeePosition(epfc.getEmplPosId(), epfc.getDescription().trim());
        } else {
            isDuplicate = employeeConfigService.isDuplicateEmployeePosition(epfc.getDescription().trim());
        }
        if(isDuplicate){
            errors.rejectValue("description", "employee.config.pos.description.duplicate", "Duplicate employee position!");
        }
    }
}


Это то что ты имел в виду?

Добавлено через 9 минут и 46 секунд
При валидации вылетает такое:
Код

java.lang.NullPointerException
        at backend.config.employee.command.EmployeePositionFormValidator.validate(EmployeePositionFormValidator.java:38)
        at backend.config.employee.EmployeePositionCtrl.processEmployeePositionForm(EmployeePositionCtrl.java:85)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)



--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Juggernaut
Дата 18.11.2009, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.12.2005

Репутация: 1
Всего: 2



Не очень понятная ошибка - номера строчек мне ни о чем не говорят.

Но похоже у тебя NPE из-за отсутствия сервиса.

Сделай такой "финт ушами":

 EmployeeTypeFormValidator etFormValidator = new EmployeeTypeFormValidator();
  etFormValidator.setService(/*..тут твой сервис из контроллера */);
etFormValidator.validate(etComm, br);

т.е. устанавливаешь сервис не через Autowired, а из контроллера.

Интересно почему сервис сам не подключился...

Добавлено через 13 минут и 26 секунд
Можно попробовать еще заменить @Autowired на @Resource
PM MAIL   Вверх
ShurikA
Дата 18.11.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зануда
***


Профиль
Группа: Завсегдатай
Сообщений: 1364
Регистрация: 29.10.2005
Где: Канада

Репутация: нет
Всего: 3



Цитата(Juggernaut @  18.11.2009,  12:12 Найти цитируемый пост)
т.е. устанавливаешь сервис не через Autowired, а из контроллера.

ну это должно сработать, но это уже не injection smile


Цитата(Juggernaut @  18.11.2009,  12:12 Найти цитируемый пост)
Можно попробовать еще заменить @Autowired на @Resource

попробую...


--------------------
Если долго мучиться, что нибудь получится...
user posted image
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0992 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.