Сущность внешнего ключа Spring Boot null - PullRequest
2 голосов
/ 24 сентября 2019

Spring Boot версия 2.1.6.

У меня есть User класс:

@Data
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    Long userID;
    String eMail;
    public User()
    {

    }
}

И LoginCredential класс:

@Data
@Entity
public class LoginCredential {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    Long userID;
    String eMail;
    String passwordHash;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id", referencedColumnName = "id")
    User user;
    public LoginCredential()
    {

    }
}

Мусорэто создает экземпляр User, когда я создаю экземпляр LoginCredential.

Причина Я запускаю эту команду: curl -X POST -H "Content-Type: application/json" -d "{ \"email\": \"a\", \"passwordHash\": \"b\" }" http://localhost:8080/login

И я получил экземпляр LoginCredential но не User.

Ответ:

{"userID":1,"passwordHash":"b","user":null,"email":"a"}

И затем я запускаю эту команду: curl -X POST -H "Content-Type: application/json" -d "{ \"email\": \"c\", \"passwordHash\": \"d\" ,\"user\":{}}" http://localhost:8080/login

И то, что я получил, это ничего , не того же ID.

Ответ:

{"userID":2,"passwordHash":"d","user":{"userID":3,"email":null},"email":"c"}

Я пропалчто-то ?Как это можно решить?

LoginCredentialController частично:

@PostMapping("/login")
LoginCredential newLoginCredential(@RequestBody LoginCredential newLoginCredential)
{   
    return repository.save(newLoginCredential);
}

My pom.xml

My application.properties

1 Ответ

1 голос
/ 24 сентября 2019
@Data
@Entity
public class LoginCredential implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    Long credentailID;
    String eMail;
    String passwordHash;
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "id", referencedColumnName = "id", nullable = false)
    @OneToOne(fetch = FetchType.EAGER) //<-- EAGER is default, but try setting it explicitly
    User user;
    public LoginCredential()
    {

    }
}



@PostMapping("/login")
LoginCredential newLoginCredential(@RequestBody LoginCredential newLoginCredential)
{   
    LoginCredential saveResult = repository.save(newLoginCredential);
    //load it again after saving 
    return repository.findbyId(saveResult.getuserId);
}

или лучше:

   @PostMapping("/login")
    ResponseEntity newLoginCredential(@RequestBody LoginCredential newLoginCredential)
    {   
      try{
        LoginCredential saveResult = repository.save(newLoginCredential);
        //load it again after saving 
        LoginCredential loaded = repository.findbyId(saveResult.getuserId);
//if you set a breakpoint here, you should already see if it is working, if its ok here, then it might have to do with serilalization ( jackson )...
            return new ResponseEntity<>(loaded,HttpStatus.OK);
          }
           catch (Exception e){
                log.error(e.getMessage());
                return       ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
            }
        }

, а у вас есть зависимость от Джексона?-> он отвечает за сериализацию объекта в json ...

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>

и это в ваших свойствах:

spring.jackson.serialization.indent_output=true
spring.jackson.default-property-inclusion=ALWAYS

надеюсь, что это помогает, ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...