# DWR - Probleme mit Konfiguration



## Tarantoga (28. Mai 2011)

Hey,
ich versuche DWR in ein Spring MVC WebProjekt einzubauen. Dabei möchte ich jetzt noch gar keine bestimmten Funktionen implementieren, sondern einfach das Ganze einmal zum Laufen bringen.
So weit so schlecht.

1) Ich habe sowohl dwr.jar als auch commons-logging.jar im lib Verzeichnis.

2) Die Testseite sieht so aus:


```
<script type="text/javascript" src="/DWR/dwr/engine.js"></script>
		<script type="text/javascript" src="/DWR/dwr/util.js"></script>
		<script type="text/javascript" src="/DWR/dwr/interface/dwrService.js"></script>
	
                <script type="text/javascript">
                    function getStuff() { 
  dwr.util.setValue("test", "Hallo");
                   }
  </script>

<input type="button" onclick="getStuff()" value="Button">
                
                <div id="test">
                    
                </div>
```

Das funktioniert soweit, also ich kann zumindest auf die dwr-Bibliotheken zugreifen.

*Jetzt zum Problem:*

Ich kann keine Java-Methoden im Script aufrufen. 
Es fängt ja schon damit an, dass ich nicht weis wie ich das ganze konfigurieren soll.
Mittels dwr.xml scheint angeblich veraltet zu sein, also habe ich es zuerst mit annotations versucht(benutze ich sehr gerne bei @MVC Controllern), bin aber gescheitert.
Danach habe ich es mit dem Spring namespace versucht, aber auch noch keinen Erfolg gehabt.

Hab mir schon die Documentation durchgelesen und tagelang gegoogelt. Ich werd einfach nicht schlau daraus.
Letzter Stand meines ApplicationContext ist:

[XML]<dwr:controller id="dwrController" debug="true" />

    <dwr:url-mapping /> 

    <dwr:configuration/>



    <dwr:annotation-config id="ac" /> 


     <bean id="Demo" class="com.ah.controller.Demo">
        <dwr:remote javascript="Demo">
             <dwr:include method="sayHello" />
        </dwr:remote>
     </bean>[/XML]

Im deployment-descriptor ist das dispatcher-servlet auch auf /dwr/* gemappt!


Der ServorLog zeigt mir auch einen Error bzw. auch ein PopUp Error im Browser (CSRF)

[XML]INFO: WEB0671: Loading application [DWR] at [/DWR]
INFO: DWR wurde erfolgreich bereitgestellt in 4.015 Millisekunden.
INFO: 4168 [http-thread-pool-8080(2)] ERROR org.directwebremoting.impl.DefaultCreatorManager  -Class not found: 'dwrService'

INFO: 4168 [http-thread-pool-8080(2)] WARN  org.directwebremoting.impl.DefaultCreatorManager  -Names of known classes are: __Data Demo __System 

INFO: 4169 [http-thread-pool-8080(2)] WARN  org.directwebremoting.servlet.ExceptionHandler  -Error: java.lang.SecurityException: Class not found

INFO: 5247 [http-thread-pool-8080(3)] ERROR org.directwebremoting.dwrp.BaseDwrpHandler  -A request has been denied as a potential CSRF attack.

INFO: 5247 [http-thread-pool-8080(3)] WARN  org.directwebremoting.dwrp.BaseCallHandler  -Exception while processing batch
java.lang.SecurityException: CSRF Security Error[/XML]

Ich seh die Fehler, finde aber keine Lösung.
Vielleicht könnte jemand mit Erfahrung in Spring mit DWR mir einen kleinen Anstoß in die richtige Richtung geben.
Danke schonmal,
Tarantoga


----------



## mvitz (28. Mai 2011)

Ich habs vor längerer Zeit so gemacht: java-library-examples - Revision 85: /trunk/dwr/spring kannst du dir ja mal anschauen. Ansonsten versuche ich morgen mal mit ner aktuellen Version und erzähle hier von meinen Erfolgen.


----------



## mvitz (28. Mai 2011)

So, hatte doch gerade ein wenig Zeit.

Folgendes funktioniert bei mir:


```
@Service
@RemoteProxy(name = "Greeter")
public class Greeter {
    @RemoteMethod
    public String greet() {
        return "Hello world!";
    }
}
```

WEB-INF/web.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>spring</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/dwr/*</url-pattern>
  </servlet-mapping>
</web-app>[/XML]

WEB-INF/spring-servlet.xml
[XML]<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd Index of /schema/context http://www.springframework.org/schema/context/spring-context-3.0.xs Index of /schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd">

  <context:annotation-config />
  <context:component-scan base-package="de.mvitz.examples.dwr.spring.annotation" />

  <dwr:configuration />
  <dwr:annotation-config />
  <dwr:controller>
    <dwr:config-param name="crossDomainSessionSecurity" value="false" />
  </dwr:controller>
  <dwr:url-mapping />

</beans>[/XML]

index.html

```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Greeter!</title>
        <script type="text/javascript" src="dwr/interface/Greeter.js"></script>
        <script type="text/javascript" src="dwr/engine.js"></script>
        <script type="text/javascript">
          function greet() {
            Greeter.greet(function(data) {
              alert(data);
            });
          }
        </script>
    </head>
    <body>
        <h1>Greeter!</h1>
        <form>
            <p>
                <input type="button" value="Greet!" onclick="greet();" />
            </p>
        </form>
    </body>
</html>
```

Hoffe das hilft dir fürs erste.


----------



## mvitz (29. Mai 2011)

Ansonsten kannst du dir hier: https://github.com/mvitz/dwr-examples die meiner Meinung nach aktuellen Methoden zum einbinden von DWR anschauen.


----------



## Tarantoga (1. Jun 2011)

Wow danke, werde mich gleich dran machen. 

EDIT:
ICh weiß nicht, aber es will einfach nicht funktionieren.
Entweder liegt es daran, dass ich kein Maven benutze, obwohl ich eig. alle relevanten Jars drin habe.

Oder an meiner allg. Konfiguration.
Zb. steht in allen Tutorials zu Spring MVC dass man zum ControllerAnnotation Scannen nur den <context:component-scan> braucht.
Bei mir funktionierte es aber erst nach hinzufügen von:

  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

???


----------



## mvitz (1. Jun 2011)

Welche Version von Spring, welche JARs hast du in WEB-INF/lib ?


----------



## Tarantoga (2. Jun 2011)

Hi,
Spring ist die Version 3.0.2
Bei den Jars brauche ich dochnur dwr.jar und comms-logging-1.1.jar, oder?

Ansonsten habe ich in meinem Testprojekt noch:
log4j-1.2.12.jar
org.springframework.aop-3.0.4.jar
bzw. alle die in der Beispiel App. der DWR Homepage angeboten sind.
(Butter Dev - David Marginian - Java Web Developer)


Außerdem legt Netbeans das lib Verzeichnis per Default nicht nach WEB-INF, sondern ganz einfach ins Root Verzeichnis.
Könnte es daran liegen?

EDIT:

bzw. wie schon oben erwähnt funktioniert DWR bereits!
Ich kann util.js und engine.js verwenden.

Nur das Zugreifen auf Java-Methoden will nicht funktionieren. Irgendwie muss es da an der Konfiguration scheitern.

mfg
Tarantoga


EDIT 2:

Ich habe Fortschritte gemacht! 
Beim aufrufen der Javascript im Browser, die wiederum eine Java-Funktion ausführt, wird jetzt ein CSRF Security Error geworfen!
Vorher ist einfach nichts passiert.
(btw. Ich machs jetzt ohne Annotations und konfiguriere es via XML)

Ich denke ich kommer der Lösung immer näher. Wie bekomme ich nun noch den Error weg?

spring-servelt.xml (Habe der Einfachheit halber mal Alles da reingepackt)
[XML] <context:annotation-config />
  <context:component-scan base-package="org.krams.tutorial.controller" /> 
  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
  <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />    
  <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>



  <dwr:controller id="dwrController" debug="true" />

   <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property value="true" name="alwaysUseFullPath"></property>
   <property name="mappings">
    <props>
      <prop key="/dwr/**/*">dwrController</prop>
    </props>
   </property>
   </bean>

   <bean class="org.krams.tutorial.service.ArithmeticService" id="Greeter">
     <dwr:remote javascript="Greeter">
        <dwr:include method="greet"/>
     </dwr:remote>
   </bean> 



    <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          prefix="/WEB-INF/jsp/"
          p:suffix=".jsp" />
    [/XML]

index.jsp

```
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Greeter!</title>
        <script type="text/javascript" src="/Krams/dwr/interface/Greeter.js"></script>
        <script type="text/javascript" src="/Krams/dwr/util.js"></script>
        <script type="text/javascript" src="/Krams/dwr/engine.js"></script>
       
        <script type="text/javascript">
          function greet() {
            Greeter.greet(function(data) {
              alert(data);
            });
          }
          function hello(){
              dwr.util.setValue("text", "Hallo");
          }
        </script>
    </head>
    <body>
        <h1>Greeter!</h1>
        <form action="#">
            <p>
                <input type="button" value="Greet!" onclick="greet();" />
                 <input type="button" value="Hallo" onclick="hello()" />          
            </p>
        </form>
         
        <div id="text">
            
        </div>
    </body>
</html>
```


Habe gelesen, dass es daran liegen könnte, dass HttpOnly per Default true ist.

Wenn ich in der web.xml nun folgendes konfiguriere:
[XML]<session-config>
    <cookie-config>
      <http-only>false</http-only>
    </cookie-config>
  </session-config>[/XML]

Bekomme ich diesen Fehler:

```
SCHWERWIEGEND: Ausnahmefehler bei der Bereitstellung der Anwendung [Krams] : org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'cookie-config'. One of '{"http://java.sun.com/xml/ns/j2ee":session-timeout}' is expected.
```

Was muss ich da nun tun?
Muss man da einen Namespace hinzufügen?


Tausend Dank schon mal.


----------



## mvitz (2. Jun 2011)

Bei meinen ersten Versuchen hatte ich den Fehler auch und habe deswegen
[XML]<dwr:controller>
  <dwr:config-param name="crossDomainSessionSecurity" value="false" />
</dwr:controller>[/XML]
genutzt.
Bei den Projekten die du auf Github findest, war das dann komischerweise nicht mehr nötig.


----------



## Tarantoga (2. Jun 2011)

Danke, Danke, Danke!!!
Jetzt funktioniert es!!!

Du hast mir wirklich sehr geholfen!!!


----------



## Tarantoga (5. Jun 2011)

Sry,
muss noch eine Frage dranhängen. 

Ich hab in der JSP die Pfade zu den jeweiligen Interfaces der Java Klassen angegeben. Jedoch findet er die Datein nicht wenn ich den Namen der aktuellen webapp bei src="" angebe.
Wenn ich den namen der WebApp eingebe, aus der ich den Code rüberkopiert habe, funktionierts, aber auch nur die alten Klassen. Die, die ich neu geschrieben habe funktionieren so und so nicht.

Meine Frage wäre also: Wohin speichert DWR die umgewandelten Java Klassen per Default?
Damit ich richtige Pfade angeben kann.

Dankeschön.


----------



## mvitz (5. Jun 2011)

Wenn du mit src="" das <script src=""> aus der JSP meinst, dann ist der Pfade eben immer /<webbappname>/<dwrmapping>/interface/<komponentnname>.js

Unter JSP kannst du dir das hartcodieren des WebAppNamens sparen, wenn du mit dem JSTL Tag <c:url ...> arbeitest.


----------



## Tarantoga (5. Jun 2011)

Genau das meine ich.

Nur heißt mein momentaner WebApp "Test", zuvor habe ich mit dem "Krams" BeispielApp herumexperimentiert.
Dann habe ich den JSP Code einfach rüberkopiert nach "Test".
Also in "Test" steht in der JSP nun "/Krams/dwr/interface/People.js".

Das funktioniert, aber wenn ich nun "Krams" durch "Test" ersetze (wie es doch eig. gehört) geht es nicht mehr.
Also wo legt DWR eig. die umgewandelten Klassen ab? Auf was müsste ich da mit <c:url > refernzieren?
bzw. warum kann ich statt "Krams" nicht einfach "Test" einsetzen, wie man es doch erwarten würde?

LG
Tarantoga


----------



## mvitz (6. Jun 2011)

Du kannst garantiert Krams durch Test ersetzen. Ich vermute die Probleme liegen bei dir an einer ganz anderen Stelle. Dafür spricht auch, dass du wie bereits oben gesagt Probleme mit den Spring Shortcuts hast.

Für eine detailiertere Analyse könntest du ja einfach mal dein Projekt hochladen.


----------



## Tarantoga (6. Jun 2011)

Du hattest Recht, im Deployment Descriptor fehlte noch was beim Mapping vom Dispatcher Servlet.
Trotzdem wundert mich, dass ich auf den Pfad mit "Krams" überhaupt zugreifen konnte, da die App nichtmal Deployed oder sonstwas war.
Ich nehme einmal an die Files werden von DWR genriert und bis zu einer Änderung des Codes nicht mehr upgedatet?
LG


----------

