# Apache MyFaces ExtVal



## mad-din (7. Mai 2010)

Hi Leute,

hat von euch schonmal jemand mit Apache MyFaces ExtVal (Apache Myfaces Extensions Validator - Apache MyFaces Extensions Validator) gearbeitet? Ich versuch mich gerade da reinzuarbeiten. Ich hab mir dazu eine simple Webapplikation mit einer DAO (Person.java), einer Bean (PersonBean.java) und einer JSF-Seite (person.jsp) erstellt. Sinn soll sein eine neue Person anzulegen und die Validierung aus den Annotations der DAO zu verwenden. 

Allerdings funktioniert es einfach nicht  Warum weiß ich noch nicht, es gibt einfach keine Fehlermeldung. Es sieht so aus als ob die Verlinkung von ExtVal fehlt. Auf den offiziellen Seiten gibt es PDF, eine Art StarterGuide, aber daraus werde ich auch nicht schlau. Die ganzen Tutorials, die ich finde, sind alle nur eine Kopie des PDFs.

Ich versuch die WAR-Datei mal noch anzuhängen. Die Anwendung besteht im Grunde aus Hibernate, der SUN JSF Implementation 1.2 und Myfaces ExtVal.

Vielleicht hat ja einer von euch einen Tipp!

Viele Grüße
Martin


----------



## Peter-S (19. Mai 2010)

Hallo Martin,

funktioniert deine Demo schon?
Du musst eigentlich nur Value-Bindings (wie immer bei den Input-Komponenten) verwenden und dann die Annotations.

Beispiel:
<h:inputText value="#{person.firstName}"/>

public class Person
{
    @Required
    private String firstName;

    //+ Getter-/Setter-Methoden
}

Falls du noch Infos brauchst, dann sind hier ein paar Links:
Extensions/Validator - Myfaces Wiki
https://svn.apache.org/repos/asf/myfaces/extensions/validator/trunk/examples/
os890 - Project Hosting on Google Code
jsfatwork - Revision 56: /fullstack-2010/trunk

Fragen werden am schnellsten direkt auf der MyFaces Mailing-Liste beantwortet - siehe:
Apache Myfaces Extensions Validator - Project Mailing Lists

Gruß,
Peter


----------



## mad-din (19. Mai 2010)

Hi,

ja die Demo und die Anwendung laufen schon, es fehlte im Grunde nur ein Eintrag in der web.xml mit folgendem Context-Param:


```
<context-param>
  <param-name>org.apache.myfaces.VALIDATE</param-name>
  <param-value>true</param-value>
</context-param>
```

Was allerdings noch komisch ist, ist die Tatsache, dass jedes DAO als Managed-Bean angelegt werden muss. Ich hab z.B. eine DAO "Person", die mit JPA-Annotations versehen ist. Dann gibt es eine Bean PersonBean, die als ManagedBean das Anlegen und Ändern einer Person übernehmen soll. Die DAO muss allerdings ebenfalls als ManagedBean angelegt werden, damit die Validierung funktioniert. Grundsätzlich kein Problem, aber wieso muss das so sein?

Viele Grüße
Martin


----------



## Peter-S (19. Mai 2010)

Hallo Martin,

dieser web.xml Eintrag ist nicht erforderlich und hat nichts mit ExtVal zu tun (siehe Demo Apps. bspw. auf os890).

Du kannst folgendes machen:

<h:inputText value="#{personPage.person.firstName}"/>

In diesem Fall ist die Klasse Person kein Managed-Bean.

Wenn du dir die Links ansiehst, dann wirst du einige Bsp. finden, die ähnliche bis gleiche Konstellationen zeigen.

Oder du verwendest das neue @ConstraintSource Feature vom aktuellen trunk.
(Allerdings fehlt noch eine offizielle Doku dafür - im Wiki gibts jedoch einen "Drafts"-Bereich - ganz unten auf Extensions/Validator/DevDoc - Myfaces Wiki)

Gruß,
Peter


----------



## mad-din (19. Mai 2010)

Hi Peter,



Peter-S hat gesagt.:


> <h:inputText value="#{personPage.person.firstName}"/>
> 
> In diesem Fall ist die Klasse Person kein Managed-Bean.



soweit so gut, lege ich allerdings die Klasse Person nicht als Managed-Bean an funktioniert die ganze Validierung nicht. Im Porjekt os890 gibt es eine Demo und zwar die allererste "demo_000" und dort ist es genau so, denn dort ist die Klasse Person als ManagedBean in der faces-config.xml angelegt.

Wie kriege ich es dann hin, dass ich nicht jedes DAO als ManagedBean anlegen muss?

Viele Grüße
Martin


----------



## Peter-S (20. Mai 2010)

Hallo Martin,

ExtVal verarbeitet nur die Property selbst und nicht die Ebenen zwischen dem 1. Bean und der Property.

Du kannst dir
asf - Revision 946472: /myfaces/extensions/validator/trunk/examples/hello_world
ansehen.

Dort hast du ein Managed-Bean mit dem Namen helloWorld und in der Seite hast du dann:
<h:inputText value="#{helloWorld.person.firstName}"/>

Die Person-Klasse ist kein Managed-Bean.
ExtVal bekommt in diesem Fall das helloWorld Bean und untersucht die Property firstName.
JSF selbst benötigt eine Getter-Methode für Person (siehe Beispiel), damit dieser Pfad aufgelöst werden kann.

Es sieht so aus als hättest du ein grundsätzliches Problem in deiner Applikation.
Am einfachsten wäre es, wenn du eine Demo App. bspw. auf Basis von demo_000 erstellst und diese Demo dem Projekt-Team zur Verfügung stellst (bitte nur einen Link an Mailing Listen schicken und nicht die Dateien selbst). Sie können dir sicher anhand dieses Beispiels deine Fragen beantworten.

Gruß,
Peter


----------

