forum.bitel.ru
http://forum.bitel.ru/

Как добавить свой Action?
http://forum.bitel.ru/viewtopic.php?f=49&t=12933
Страница 1 из 1

Автор:  Dog [ 24 июн 2018, 17:12 ]
Заголовок сообщения:  Как добавить свой Action?

Решил добавить форму(возможность привязывать к процессу устройство):

Код:
[/BGCRM/webapps/WEB-INF/jspf/user/plugin/bgbilling/custom]# cat process_link_for_add_custom_list.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ include file="/WEB-INF/jspf/taglibs.jsp"%>

<c:set var="plugin" value="${ctxPluginManager.pluginMap['bgbilling']}"/>

<c:forEach var="billing" items="${plugin.dbInfoManager.dbInfoList}">
        <c:set var="id" value="bgbilling-${billing.id}"/>

        <c:set var="linkObjectItems" scope="request">
                ${linkObjectItems}
                <li value="${id}">Договор: ${billing.title}</li>

                <li value="${id}-inetDevice">Устройство: ${billing.title}</li>

        </c:set>
        <c:set var="linkObjectForms" scope="request">
                ${linkObjectForms}
                <form action="/user/plugin/bgbilling/contract.do" id="${id}" style="display: none;">
                        <input type="checkbox" name="check" style="display: none;"/>
                        <input type="hidden" name="processId" value="${form.id}"/>
                        <input type="hidden" name="billingId" value="${billing.id}"/>
                        <input type="hidden" name="action" value="addProcessContractLink"/>
                        <input style="width: 100%;" name="contractTitle" placeholder="Номер договора"/>
                </form>

                <form action="/user/plugin/bgbilling/custom/contract.do" id="${id}-inetDevice" style="display: none;">
                        <input type="checkbox" name="check" style="display: none;"/>
                        <input type="hidden" name="processId" value="${form.id}"/>
                        <input type="hidden" name="billingId" value="${billing.id}"/>
                        <input type="hidden" name="action" value="addProcessInetDeviceLink"/>
                        <input style="width: 100%;" name="devId" placeholder="ID устройтва"/>
                        <%--
                        <input style="width: 100%;" name="devIp" placeholder="IP устройтва"/>
                        --%>
                </form>

        </c:set>
</c:forEach>

Код:
<!-- Custom link device -->
<action path="/user/plugin/bgbilling/custom/contract" parameter="action" type="ru.bgcrm.dyn.itsm.plugin.bgbilling.struts.action.ExtContractAction" name="form" scope="request">
             <forward name="default" path="/WEB-INF/jspf/user/plugin/bgbilling/contract.jsp"/>
</action>
<!-- Custom -->


есть класс с экшеном:

Код:
package ru.bgcrm.dyn.itsm.plugin.bgbilling.struts.action;

...

public class ExtContractAction extends ContractAction {

   /**
    *
    */
   public ExtContractAction() {
      super();
   }
   
   /*
    * Добавляем привязку устройства к процессу.
    *
    * @param mapping
    * @param form
    * @param request
    * @param response
    * @param con
    * @return
    *
    * @throws BGException
    */
   public ActionForward addProcessInetDeviceLink(ActionMapping mapping, DynActionForm form, HttpServletRequest request,
         HttpServletResponse response, Connection con) throws BGException {
      String billingId = form.getParam("billingId");
      int processId = form.getParamInt("processId");
      int deviceId = form.getParamInt("devId");
      // String devIp = form.getParam("devIp");

      if ((Utils.isBlankString(billingId)) || (processId <= 0)
            || (deviceId <= 0) /* || Utils.validateIPv4(devIp) */ ) {
         throw new BGIllegalArgumentException();
      }
      User user = form.getUser();
      ExtInetDAO inetDao = new ExtInetDAO(user, billingId);
      InetDevice inetDevice = inetDao.getDevice(deviceId);

      CommonObjectLink link = new CommonObjectLink("process", processId, "device:" + billingId, inetDevice.getId(),
            inetDevice.getTitle());
      LinkAction.addLink(form, con, link);

      return processJsonForward(con, form, response);
   }
}



в итоге при изменении прилетает:

Код:
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.ClassNotFoundException: ru.bgcrm.dyn.itsm.plugin.bgbilling.struts.action.ExtContractAction
   org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
   org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
   org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
   ru.bgcrm.servlet.filter.SetRequestParamsFilter.doFilter(SetRequestParamsFilter.java:46)
   ru.bgcrm.servlet.filter.AuthFilter.doFilter(AuthFilter.java:115)
   ru.bgcrm.servlet.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:38)
root cause

java.lang.ClassNotFoundException: ru.bgcrm.dyn.itsm.plugin.bgbilling.struts.action.ExtContractAction
   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1688)
   org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1533)
   org.apache.struts.chain.commands.util.ClassUtils.getApplicationClass(ClassUtils.java:54)
   org.apache.struts.chain.commands.util.ClassUtils.getApplicationInstance(ClassUtils.java:71)
   org.apache.struts.chain.commands.servlet.CreateAction.createAction(CreateAction.java:98)
   org.apache.struts.chain.commands.servlet.CreateAction.getAction(CreateAction.java:68)
   org.apache.struts.chain.commands.AbstractCreateAction.execute(AbstractCreateAction.java:91)
   org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
   org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
   org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
   org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
   org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
   org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
   org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
   javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
   ru.bgcrm.servlet.filter.SetRequestParamsFilter.doFilter(SetRequestParamsFilter.java:46)
   ru.bgcrm.servlet.filter.AuthFilter.doFilter(AuthFilter.java:115)
   ru.bgcrm.servlet.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:38)

Автор:  Dog [ 24 июн 2018, 17:26 ]
Заголовок сообщения:  Re: Как добавить свой Action?

если подсовывать класс в компилированном jar'e:

Код:
06-24/14:55:02 ERROR [http-bio-9088-exec-10] ExtContractAction -
java.lang.NullPointerException
        at ru.bgcrm.struts.action.BaseAction.dispatchMethod(BaseAction.java:199)
        at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:170)
        at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58)
        at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67)
        at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
        at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:305)
        at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:191)
        at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
        at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at ru.bgcrm.servlet.filter.SetRequestParamsFilter.doFilter(SetRequestParamsFilter.java:46)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at ru.bgcrm.servlet.filter.AuthFilter.doFilter(AuthFilter.java:115)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at ru.bgcrm.servlet.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:38)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)


похоже что не пролезло в каком то фильтре?

Автор:  Администратор [ 25 июн 2018, 00:28 ]
Заголовок сообщения:  Re: Как добавить свой Action?

Проще всего добавить свой плагин. Закиньте XML с объявлением в webapps/plugin.
В webapps/WEB-INF есть отдельные файлы для Struts акшенов.
Динамический код там загрузить пока не получится, но можно скопилировать и подсунуть свой jar в lib.
Исходники открыть помогло бы в изучении?

Автор:  Dog [ 25 июн 2018, 00:35 ]
Заголовок сообщения:  Re: Как добавить свой Action?

в общем да:

1. надо было компилировать (причем всё что импоритируется в классах)
2. писать в филтрах:

Код:
<item title="Устройства">
    <item action="ru.ххх.bgcrm.itsm.plugin.bgbilling.struts.action.ExtContractAction:addProcessInetDeviceLink" title="Привязка устройства к процессу"/>
</item>


все работает.

Автор:  Dog [ 25 июн 2018, 00:38 ]
Заголовок сообщения:  Re: Как добавить свой Action?

Администратор писал(а):
Проще всего добавить свой плагин. Закиньте XML с объявлением в webapps/plugin.
В webapps/WEB-INF есть отдельные файлы для Struts акшенов.
Динамический код там загрузить пока не получится, но можно скопилировать и подсунуть свой jar в lib.
Исходники открыть помогло бы в изучении?


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

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/