# Probleme mit Java + Tomcat | Cannot switch on a value of type String for source level below 1.7



## Gimlie (30. Aug 2014)

Hallo,
ich hoffe ich bin mit meinem Anliegen im richtigen Bereich.
Ich habe ein Problem welches mich verzweifeln lässt und wobei mir die Forumsuche und Google leider nicht weiter geholfen haben.

System:
- Java 8
- Eclipse Luna
- Tomcat 7
- JAVA_HOME zeigt auf Java 8

In einer JSP habe ich einen "switch-case" mit "String-Variablen". Beim Aufruf der Seite erscheint folgender Fehler:

```
org.apache.jasper.JasperException: Unable to compile class for JSP: 

An error occurred at line: 62 in the jsp file: /Main.jsp
Cannot switch on a value of type String for source level below 1.7. Only convertible int values or enum variables are permitted
59: 							else
60: 							{
61: 								Contact[] contact = null;
62: 								switch(session.getAttribute("maintyp").toString())
63: 								{
64: 									case "contactgroup":
65: 									{


Stacktrace:
	org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
	org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:366)
	org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:476)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:657)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	controler.Controler.doPost(Controler.java:215)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
```

Alle Systeme nutzen aus meiner Sicht und nach Prüfung der Einstellungen Java 8. Compilen auf Java 6 oder 7 und dann zurück haben nichts gebracht. Habe den Fehler auf zwei Systemen. 
Irgendwas ist falsch, ich weiß aber nicht was. Ich hoffe ihr könnt mir helfen!


----------



## JavaMeister (30. Aug 2014)

Gib das doch mal bei google ein...


----------



## Gimlie (30. Aug 2014)

Hallo JavaMeister,
ich habe über 2 Stunden Google Recherche hinter mir.
Ich nutze Java 8, Eclipse schmeißt keinen Fehler. Tomcat bezieht, laut meinen Infos, die Java Version auf der JAVA_HOME, die steht auch auf Java 8.
Genau aus dem Grund habe ich mich an die User hier im Forum gewandt.


----------



## gp (31. Aug 2014)

Die Fehlermeldung sagt, dass du kein Java 8 verwendest - deshalb wird swich auch nicht mit Strings zurecht kommen. Und da du nicht verräts, wie der Tomcat gestartet wird und/oder konfiguriert wird, kann ich dir nur raten, in dieser Richtung zu suchen.


----------



## Gimlie (31. Aug 2014)

Hallo gp,
danke für deine Hinweise. Was der Fehler besagt ist mir bewusst, ich denke auch, dass die Lösung total banal ist, aber ich sie trotzdem nicht finde.
Aber erstmal mehr Infos:
Der Tomcat wird aus Eclipse raus gestartet.
Das Java Projekt ist ein Java 8 Projekt:
Anhang anzeigen 6779

Tomcat ist wie gesagt über Eclipse mit folgenden Einstellungen eingebunden:


Da ich gelesen habe, dass Tomcat die Java Version gerne auch anhand der JAVA_HOME Variable aussucht, habe ich diese wie folgt konfiguriert:


Ich hoffe die Infos helfen weiter. Bitte gebt mir auch bescheid, was ihr ggf. noch braucht.

Vielen Dank!


----------



## gp (31. Aug 2014)

Mit Eclipse arbeite ich nicht und starte meinen Tomcat auch immer ohne Entwicklungsumgebung.
Im Standardfall hat der Tomcat eine Management-Webanwendung, z.B. unter http://127.0.0.1:8080/manager/html zu erreichen. Dort sieht man, welches Java verwendet wird.
Ich vermute aber mal, dass die Lösung zur web.xml führt (unter ..\tomcat\conf\ zu finden). Dort kann der jsp-Compiler definiet werden (compilerSourceVM und compilerTargetVM), der steht im Standardfall auf 1.6 - das könnte die Erklärung sein.


----------



## Gimlie (31. Aug 2014)

Die Management-Oberfläche habe ich gefunden. Doch laut der nutzt Tomcat Java 8.


----------



## gp (31. Aug 2014)

Das ändert aber nichts an den Compiler-Einstellungen in der web.inf

Warum nutzt Tomcat auch in der Version 8 ein altes Java? Das hängt damit zusammen, dass eine Webanwendung auch auf fremden Systemen laufen soll. Es kann dann nicht sichergestell werden, dass z.B. ein Java 8 läuft. Daher sollten SP-Dateien auf solche Konstrukte verzichte. Mit IF-Abfragen sollte man auch zum Ergebnis kommen. Davon abgesehen, dass man Java-Code in JSP-Dateien vermeiden sollte.

Davon aber abgesehen - trage die beiden Schalter in die web.xml ein (notfalls in die deiner Anwendung) und die Datei sollte sich übersetzen lassen.


----------



## Gimlie (31. Aug 2014)

Hallo gp,
besten Dank! Genau an den Einstellungen hat es gehakt.
Folgenden Code muss man über Eclipse beim Server in die web.xml eintragen:

```
<init-param>                               
     		<param-name>compilerSourceVM</param-name>
      		<param-value>1.8</param-value>
 		</init-param>
  		<init-param>
     		<param-name>compilerTargetVM</param-name>
      		<param-value>1.8</param-value>
  		</init-param>
```

Direkt über:

```
<load-on-startup>3</load-on-startup>
```

Damit hat es bei mir super funktioniert!

Danke auch für deinen "Architektur-Hinweis": Das Projekt ist fürs Studium, wo wir bestimmte Vorraussetzungen definieren konnten, daher brauchen wir uns in dem Zuge um eine Abwärtskompatibilität keine Gedanken zu machen.
Der Java-Code in den JSPs ist bereits so minimal gehalten wie möglich, die Haupt-Logik liegt in den Servlets. Aber wir schauen mal, ob wir das nicht noch weiter optimieren können.

Danke!


----------

