2017-03-13 3 views
0

ich zwei Datenmodell User und Auto haben:Fehlgeschlagen Wert vom Typ Objekt zu Objekt Frühling erforderlich Typ konvertieren

User.java:

@Entity 
@Table(name="APP_USER") 
public class User implements Serializable{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
private Integer id; 
...... 

@OneToMany(mappedBy="user",cascade=CascadeType.ALL) 
private Set<Car> cars = new HashSet<Car>(); 

Car.java:

@Entity 
public class Car implements Serializable { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int id ; 
..... 

@ManyToOne(optional=false) 
@JoinColumn(name="user_fk") 
private User user; 

In der Steuerung möchte ich einen neuen Benutzer hinzufügen, also

AppController.java:

@Controller 
@RequestMapping("/") 
@SessionAttributes("roles") 
public class AppController { 

@RequestMapping(value = { "/newuser" }, method = RequestMethod.GET) 
public String newUser(ModelMap model) { 
    User user = new User(); 
    model.addAttribute("user", user); 
    model.addAttribute("edit", false); 
    model.addAttribute("loggedinuser", getPrincipal()); 
    return "registration"; 
} 

@RequestMapping(value = { "/newuser" }, method = RequestMethod.POST) 
public String saveUser(@ModelAttribute @Valid User user, BindingResult result, 
     ModelMap model) { 

    if (result.hasErrors()) { 
     return "registration"; 
    } 

    if(!userService.isUserSSOUnique(user.getId(), user.getSsoId())){ 
     FieldError ssoError =new FieldError("user","ssoId",messageSource.getMessage("non.unique.ssoId", new String[]{user.getSsoId()}, Locale.getDefault())); 
     result.addError(ssoError); 
     return "registration"; 
    } 

    userService.saveUser(user); 
    model.addAttribute("success", "User " + user.getFirstName() + " "+ user.getLastName() + " registered successfully"); 
    model.addAttribute("loggedinuser", getPrincipal()); 
    return "registrationsuccess"; 
} 

Auch habe ich eine Klasse mit dem Namen StringToUser (Implementiert Converter so kann ich ein neues Auto hinzufügen, die einen Benutzer enthalten)

StringtoUser.java:

Die AppController.java und saveUser-Methode funktioniert gut, bevor ich die StringToUser-Klasse .But nach dem Erstellen hinzufügen d StringToUser Klasse, bekomme ich einen Fehler in Saveuser Methode

The error is : WARNING: Failed to bind request element: org.springframework.beans.TypeMismatchException: Failed to convert value of type [com.websystique.springmvc.model.User] to required type [com.websystique.springmvc.model.User]; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [com.websystique.springmvc.model.User] to type [@org.springframework.web.bind.annotation.ModelAttribute @javax.validation.Valid com.websystique.springmvc.model.User] for value 'User [id=null, ssoId=alaa, password=alaa1991, firstName=, lastName=, email=, userProfiles=null, accounts=null, userDocuments=[], cars=[], documents=[]]'; nested exception is java.lang.ClassCastException: com.websystique.springmvc.model.User cannot be cast to java.lang.String 

Edit:

Der Fehler:

WARNING: Failed to bind request element: org.springframework.beans.TypeMismatchException: Failed to convert value of type [com.websystique.springmvc.model.User] to required type [com.websystique.springmvc.model.User]; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [com.websystique.springmvc.model.User] to type [@org.springframework.web.bind.annotation.ModelAttribute @javax.validation.Valid com.websystique.springmvc.model.User] for value 'User [id=null, ssoId=alaa, password=alaa1991, firstName=, lastName=, email=, userProfiles=null, accounts=null, userDocuments=[], cars=[], documents=[]]'; nested exception is java.lang.NullPointerException 
+0

Es scheint, dass Ihre Convert-Klasse einen Verweis auf die User-Klasse statt der String-Repräsentation erhält, die Sie benötigen. Haben Sie versucht, zu ersetzen: Integer id = Integer.parseInt ((String) -Element); für: Ganzzahl id = ((Benutzer) -Element) .getId(); –

+0

Ich habe gerade versucht, Sie Beispiel, bekomme ich das gleiche Problem! –

+0

Können Sie die vollständige Fehler-Stack-Ablaufverfolgung bereitstellen? Sind Sie sicher, dass es in der Konverterklasse ausfällt? –

Antwort

0

Sie brauchen keinen Konverter zu verwenden, Feder selbst formatieren Sie Ihre Form in eine Benutzer Klasse.

Wenn Sie Ihre Konverterklasse debuggen, werden Sie feststellen, dass Sie keine Zeichenfolge als Parameter erhalten. Sie erhalten einen Verweis auf eine Instanz der Klasse Benutzer. Sie konvertieren also einen Benutzer zu einem Benutzer, der keinen Sinn ergibt.

@Override 
    public User convert(Object element) { 
     if (element == null) { 
      return null; 
     } 
     Integer id = ((User)element).getId(); 
     User user = userService.findById(id); 
     return user; 
    } 

Nun, da Sie einen neuen Benutzer erstellen möchten, wird das Formular nicht gesetzt und ID, daher bieten Sie Userservice eine Null. Ihr Dienst schlägt fehl und Ihr Konverter zeigt diesen Fehler nicht an.

Einfache Lösung ist es einfach zu entfernen.

Ich verstehe, dass Sie den Rollenkonverter hinzufügen, da das Formular Ihnen eine Liste von Ganzzahlen sendet, die von Frühling in einem Set nicht geparst werden können. Ich würde Ihnen dringend empfehlen, Command-Objekte als Vermittler zu Ihrem Modell zu implementieren, damit Sie die Verwendung eines Sets vermeiden können.

Aber wenn Sie einen Konverter implementieren müssen, würde ich folgende Änderungen vorschlagen:

@Component 
public class RoleToUserProfileConverter implements Converter<Object, UserProfile>{ 

    static final Logger logger = LoggerFactory.getLogger(RoleToUserProfileConverter.class); 

    @Autowired 
    private UserProfileService userProfileService; 


    private HashMap<Integer, UserProfile> userProfiles; 

    /** 
    * Gets UserProfile by Id 
    * @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object) 
    */ 
    public UserProfile convert(Object element) { 
     Integer id = Integer.parseInt((String)element); 
     UserProfile profile = findUserProfile(id); 
     logger.info("Profile : {}",profile); 
     return profile; 
    } 

    private UserProfile findUserProfile(Integer id) { 
     //First time loading profiles 
     if(userProfiles == null) { 
      userProfiles = new HashMap<>(); 
      List<UserProfile> userProfileList = userProfileService.findAll(); 
      for(UserProfile userProfile: userProfileList) { 
       userProfiles.put(userProfile.getId(), userProfile); 
      } 
     } 
     if(userProfiles.containsKey(id)) { 
      return userProfiles.get(id); 
     } 
     return null; 
    } 

} 

In diesem Beispiel habe ich eine hashmap verwenden, um alle Userprofiles zu halten, die weniger ändern sollte, dann diejenigen sind nur das erste Mal geladen und retriviert.

Sie könnten es verbessern, indem Sie überprüfen, ob die ID, die Sie suchen, im Hash otherwhise die Datenbank abfragen und speichern, so dass neue UserProfiles bei Bedarf geladen werden.

+0

Hallo @ Cristian, ich habe nur StringtoUser Klasse entfernt und findUserProfile Methode hinzugefügt, ich habe den gleichen Fehler, Der Benutzer fom funktioniert gut, aber die Autos bilden nicht, der Fehler ist der gleiche: –

+0

org.apache.jasper.JasperException: java.lang.IllegalStateException : Weder BindingResult noch einfaches Zielobjekt für den Bean-Namen 'user' als Request-Attribut verfügbar –

+0

Cristian, kann ich diese Klasse erstellen, ohne Konverter zu Rollen und Benutzer zu verwenden? Ich bin neu in Spring, aber in JSF können wir das ohne Konverter !! –

Verwandte Themen