2017-09-09 45 views
0

我剛剛開始使用Spring Boot CrudRepository,現在我的Enitity有一個唯一字段(不是P.K)FeedID和自動生成的值。 當我手動創建一個新對象而沒有設置FeedID值時,它工作正常,FeedID自動生成。 但是,當我使用JackSon對象映射器直接將請求參數Json轉換爲pojo對象時,它顯示FeedID字段爲空/重複異常。Hibernate AutoGenerated值不適用於Jackson mapper

控制器

@RequestMapping(method=RequestMethod.POST,value="/feed/addNewFeed") 
public Feed addNewFeed(@RequestParam("Feed") String jsonFeed) throws JsonParseException, JsonMappingException, IOException { 
    Feed feed = new ObjectMapper().readValue(jsonFeed, Feed.class);   
    return feedRepoImplementation.addNewFeedImpl(feed);  
} 

ENTITY

@GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(nullable = false, unique = true) 
    private int FEED_ID; 
    @Id 
    @Column(length=100) 
    private String URL_LINK;//Primary Key 
    private String HEADLINE; 
    @Column(length=1500,nullable=false) 
    private String CONTENT; 
    @Column(length=500,nullable=false) 
    private String HEADLINE_IMAGE; 
    private FeedCatagory CATAGORY; 
    private String AUTHOUR_NAME; 
    private String PUBLISHING_DATE; 
    private String PUBLISHED; 
    private int VIEWS; 
    private int SHARED; 

ERROR

com.microsoft.sqlserver.jdbc.SQLServerException: Violation of UNIQUE KEY constraint 'UK_6hu52poark0i0f4us9cfql8au'. Cannot insert duplicate key in object 'dbo.feed'. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216) ~[sqljdbc4.jar:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515) ~[sqljdbc4.jar:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:404) ~[sqljdbc4.jar:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:350) ~[sqljdbc4.jar:na] 
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696) ~[sqljdbc4.jar:na] 

但是代替使用ObjectMap的每如果我不碰FeedID場手動創建POJO它工作正常

Feed feed = new Feed(); 
    feed.setAUTHOUR_NAME("AUTHOUR"); 
    feed.setCATAGORY(UtilityHelper.FeedCatagory.SPORTS); 
    feed.setPUBLISHING_DATE("12/10/16"); 
    feed.setCONTENT("CONTENT"); 
    feed.setURL_LINK("URL-LINK"); 
    feed.setHEADLINE("HEADLINE"); 
    feed.setPUBLISHED("TRUE"); 
    feed.setSHARED(0); 
    feed.setVIEWS(0); 
    feedRepository.save(feed); 

我猜是客戶端JSON裏面我沒有不包括自動生成的場「FeedID」,所以obectMapper自動分配0〜該字段,但作爲0已經存在,所以重複約束顯示。請幫助

+0

如果我傳遞「feedID」:nul在json裏面,它顯示空指針, – Chanky

+0

你的代碼也會將ID保留爲默認值:0。你爲什麼不用你的調試器來查看你的JSON包含哪個值,以及哪個你的ID包含什麼值?另外,爲什麼不尊重Java命名約定,以及爲什麼將JSON作爲請求參數發送,而不是直接將它作爲請求主體發送? –

+0

@Chanky。您是否嘗試了feedID與空格:'feedID:「'' –

回答

1

使用@RequestBody註釋,而不是@RequestParam並從前端或郵遞員將一個字符串中使用ObjectMapper到對象發送JSON,因此就沒有必要。

@RequestMapping(value="/feed/addNewFeed",method=RequestMethod.POST) 
public Feed addNewFeed(@RequestBody Feed feed){  
    return feedRepoImplementation.addNewFeedImpl(feed);  
} 

而且你正在使用@GeneratedValueFEED_ID領域。如果它與@Id一起使用,@GeneratedValue將創建唯一編號。

@GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(nullable = false, unique = true) 
    private int FEED_ID; 

既然你已經@Id標註的字段它會更好,如果你生成唯一編號手動FEED_ID。對於這一點,你必須使用@PrePersist標註在實體類是這樣的:

@PrePersist 
public void initializeFeedId() { 
    Random random = new Random(System.currentTimeMillis()); 
    this.FEED_ID = random.nextInt(1000000000); 
} 

這將根據當前時間產生的唯一編號。

+0

使用RequestBody更改了RequestMapping,並使用POSTMAN的body選項發送了JSON數據,但沒有運氣,發生同樣的事情,https://img42.com/mH27W – Chanky

+0

您能否提供complete stacktrace –

+0

您正在使用哪個數據庫? –

相關問題