# Fachklasse und Command-Object



## KalleM (13. Jun 2011)

hallo,
habe ein fachklasse und diese fachklasse wird auf die db abgebildet, dazu nutze ich hibertnate mit annotations. wenn ich diese fachklasse nun als command-object nutzen möchte (um formulardaten zu erhalten) erhalte ich immer eine fehlermeldung (etwas mit den getter und setter methoden stimmt angeblich nicht). wenn ich mir eine fachklasse ohne die annotions schreibe ist alles ok, nur muss ich so erst eine klasse ohne annotions als command-object nutzen und dann die attribute an die eigentlich fachklasse übergeben, ist das normal oder habe ich etwas übersehen bzw. mache ich etwas falsch?


----------



## SlaterB (14. Jun 2011)

wäre schön wenn du die Fehlermeldungen exakt postest,
und meckert bereits der Compiler oder erst später die Laufzeit?

verwendest du noch irgendwelche Frameworks wie eine Web-Applikation oder das ganz allgemeine Command-Interface von Java 
bzw. ein eigenes, ist ja nix dran,
wofür überhaupt, was machst du dann mit diesen Objekten als Commands interpretiert?
an wen werden sie übergeben, an eigene Threads? was ist eigentlich die Command-Funktion, gibt es eine run()-Methode mit festen Code?

generell fällt mir keine Möglichkeit ein was hierbei schiefgehen könnte,

statt Klassen zu verdoppeln kannst du überlegen, nur einfache relativ leere Command-Objekte zu verwenden und die Fachklassen-Objekte dort als ein wichtiges bekanntes Attribut zu setzen, auf welches wiederum per get/set zugegriffen werden kann, falls das nicht erneut Probleme macht..


----------



## KalleM (14. Jun 2011)

mh, stimmt meine infos sind nicht präzise. 
ich benutze: spring 3, für eine webanwendung. die fehlermeldung kommt erst zur laufzeit (die originale meldung habe ich nicht mehr, dafür müsste ich es erst wieder umbauen).
was ich mache? ich habe einen uploadhandler und eine kleine "datei-verwaltung". über die "datei-verwaltung" kann ich einige attribute einer datei ändern (über formfelder, diese attribute sind attribute der fachklasse).
ich hatte/habe ein command-object mit den attributen, die ich wirklich brauche bzw. ändern kann (zum beispiel um boolesche attribute auszulesen). dann bin ich auf den trichter gekommen, einfach die fachklasse zu nehmen und über diese die formulardaten auszulesen. so hätte ich eine klasse gespart.


----------



## FArt (15. Jun 2011)

KalleM hat gesagt.:


> mh, stimmt meine infos sind nicht präzise.
> ich benutze: spring 3, für eine webanwendung. die fehlermeldung kommt erst zur laufzeit (die originale meldung habe ich nicht mehr, dafür müsste ich es erst wieder umbauen).
> was ich mache? ich habe einen uploadhandler und eine kleine "datei-verwaltung". über die "datei-verwaltung" kann ich einige attribute einer datei ändern (über formfelder, diese attribute sind attribute der fachklasse).
> ich hatte/habe ein command-object mit den attributen, die ich wirklich brauche bzw. ändern kann (zum beispiel um boolesche attribute auszulesen). dann bin ich auf den trichter gekommen, einfach die fachklasse zu nehmen und über diese die formulardaten auszulesen. so hätte ich eine klasse gespart.



Das ist die Fehlermeldung... habe ich bisher noch nie gesehen. Google doch mal danach...


----------



## KalleM (15. Jun 2011)

org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/manager.jsp at line 37

34:     								</p>
35:     								<p>
36:     									Select new visibility: 
37:     									<form:select path="visible">
38:     										<formption value="true"/>
39:     										<formption value="false"/>
40:     									</form:select>


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:519)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:428)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
	org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1031)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:815)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:717)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.springframework.beans.NotReadablePropertyException: Invalid property 'visible' of bean class [[[entity.Document;]: Bean property 'visible' 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:703)
	org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:695)
	org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:147)
	org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
	org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:194)
	org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getName(AbstractDataBoundFormElementTag.java:160)
	org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.autogenerateId(AbstractDataBoundFormElementTag.java:147)
	org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.resolveId(AbstractDataBoundFormElementTag.java:138)
	org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.writeDefaultAttributes(AbstractDataBoundFormElementTag.java:122)
	org.springframework.web.servlet.tags.form.AbstractHtmlElementTag.writeDefaultAttributes(AbstractHtmlElementTag.java:408)
	org.springframework.web.servlet.tags.form.SelectTag.writeTagContent(SelectTag.java:198)
	org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
	org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
	org.apache.jsp.WEB_002dINF.jsp.manager_jsp._jspService(manager_jsp.java:179)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
	org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
	org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1031)
	org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:815)
	org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:717)
	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
	org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


----------



## SlaterB (15. Jun 2011)

> NotReadablePropertyException: Invalid property 'visible' of bean class [[[entity.Document;]: Bean property 'visible' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?


klingt doch ziemlich konkret, zumindest soweit dass du auch Document.java posten solltest,
hat das aber wirklich mit einer Command-Sache zu tun? 
dass ein Bean in JSP vorbeikommt ist doch recht alltäglich und die Fehlermeldung dann ebenso normal in diesem Bereich

was lässt dich auf Annotations schließen?

'visible' ist generell verdächtig ein Schlüsselwort in JSP-Tags und wer weiß wo, kein gutes Beispiel,
oder hast du auch gar nicht erst ein derartiges Attribut?


----------



## KalleM (15. Jun 2011)

```
@Entity
@Table(name="DOCUMENT")
public class Document 
{
	private long documentId;
	private String documentName;
	private boolean visible;
	private Owner owner;
	
	public Document(){}
	
	public Document(String documentName, boolean visible, Owner owner)
	{
		this.documentName = documentName;
		this.visible = visible;
		this.owner = owner;
	}
	
	@Id
	@GeneratedValue
	@Column(name="DOCUMENT_ID")
	public long getDocumentId()
	{
		return this.documentId;
	}
	
	public void setDocumentId(long id)
	{
		this.documentId = id;
	}
	
	@Column(name="DOCUMENT_NAME")
	public String getDocumentName()
	{
		return this.documentName;
	}
	
	public void setDocumentName(String documentName)
	{
		this.documentName = documentName;
	}
	
	@Column(name="VISIBLE", nullable = false)
	public boolean getVisible()
	{
		return this.visible;
	}
	
	public void setVisible(boolean visible)
	{
		this.visible = visible;
	}
	
	@ManyToOne(cascade = CascadeType.ALL)
	public Owner getOwner()
	{
		return this.owner;
	}
	
	public void setOwner(Owner owner)
	{
		this.owner = owner;
	}
}
```

wenn ich es mit einer klasse ohne annotations mache, 


```
public class Document 
{
	private boolean visible;
	
	public boolean getVisible()
	{
		return this.visible;
	}
	
	public void setVisible(boolean visible)
	{
		this.visible = visible;
	}
}
```
klappt es (es müsste doch auch schnuppe sein, ob die anderen attribute mit werten belegt werden, so sind sie dann halt erstmal null)

es kann also nicht an dem attribut "visible" liegen.

ich muss dazu sagen, das ich mitlerweile, eine in meinen augen vernüftige lösung gefunden haben. da ich noch weitere attribute per post an den server schicke, die ich für ein paar if-abfragen benötige. so habe ich mir eine klasse geschrieben (ohne annotions mit der ich die werte auslese). 
es kann natürlich sein, das ich irgendwo etwas falsch verstanden oder etwas übersehen habe(hoffentlich keinen tippfehler).
um mit spring etc. etwas besser klar zu kommen, habe ich mich an diesem tutorial Spring Form Tags orientiert.
ich bin mir nicht sicher, aber kann es sein, das der author mit dem package "domain" halt keine entity klassen meint, sonder halt command-objecte, die nicht direkt auf die db abgebildet werden?
das heisst dann immer, das ich mir erst die daten vom client hole, sie dann über einen handler auslese und dann in die db schreibe bzw eine hibernate session starte und die entsprechenden werte setze.


----------



## KalleM (16. Jun 2011)

hallo,
ich habe meinen fehler gefunden (hat mich fast wahnsinning gemacht, man an was ich nicht alles gedacht habe, habe es verfl. . . .).
nun gut, das problem ist gewesen, das ich in dem handler ein attribut ${document} an die jsp übergebe und dieses attribut hat den selben namen wie die klasse (die version ohne annotations hat bei mir einen anderen name, also anders als oben). um bei dem beispiel von oben zu bleiben. jetzt, nachdem ich das attribut umbenannt habe klappt es endlich.:autsch:


----------



## SlaterB (16. Jun 2011)

hmm, dann lag ich mit Schlüsselwort nicht ganz falsch? 
man sollte wirklich auf gewisse Begriffe leider verzichten


----------

