【发布时间】:2018-02-18 00:47:57
【问题描述】:
我刚开始使用 Spring Boot CrudRepository,现在我的实体有一个具有自动生成值的唯一字段(不是 P.K)FeedID。 当我手动创建一个新对象而不设置 FeedID 值时,它工作正常,FeedID 自动生成。 但是当我使用 JackSon 对象映射器将请求参数 Json 直接转换为 pojo 对象时,它显示 FeedID 字段的空/重复异常。
控制器
@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);
}
实体
@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;
错误
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]
但是如果我手动创建 pojo 而不是使用 Objectmapper 而不触及 FeedID 字段,它可以正常工作
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 已经存在所以重复约束显示。请帮忙
【问题讨论】:
-
如果我在 json 中传递 "feedID":nul 它会显示空指针,
-
您的代码也将 ID 保留为其默认值:0。为什么不使用调试器查看 JSON 包含哪些值,以及您的 ID 包含哪些值?另外,为什么不尊重 Java 命名约定,为什么将 JSON 作为请求参数发送,而不是直接作为请求正文发送?
-
@Chanky 。您是否尝试过带空格的 feedID:
feedID:""
标签: spring hibernate jpa spring-boot jackson