我整個周末都在試圖除錯這段代碼。我有一個 Spring RestController :
import com.tsakirogf.schedu.model.ContactMean;
import com.tsakirogf.schedu.model.DefaultContactMean;
import com.tsakirogf.schedu.model.human.Business;
import com.tsakirogf.schedu.services.BusinessService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.Optional;
import java.util.Set;
@RestController
@RequestMapping("api/v1/business/")
public class BusinessController
{
@Autowired
BusinessService businessService;
@GetMapping(value = "businesss")
Iterable<Business> list()
{
Iterable<Business> retVal = businessService.findAll();
return retVal;
}
@RequestMapping(value = "business", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
Business create(@RequestBody Business business)
{
CollectionOfContactMethods collectionOfContact = business.getContact();
collectionOfContact.setBusiness(business);
Set<ContactMean> contactMeanSet = collectionOfContact.getContactMeans();
DefaultContactMean defaultContactMeanSet = collectionOfContact.getDefaultContactMean();
defaultContactMeanSet.getCollectionOfContactMethodsDefault().setId(collectionOfContact.getId());
for (ContactMean element : contactMeanSet)
{
element.setCollectionOfContactMethods(collectionOfContact);
}
collectionOfContact.setDefaultContactMean(defaultContactMeanSet);
business.setContact(collectionOfContact);
Business retval = businessService.save(business);
return retval;
}
@RequestMapping(value = "business/{id}", method = RequestMethod.GET )
Optional<Business> get(@PathVariable Long id)
{
return businessService.findById(id);
}
}
和服務:
public interface BusinessService extends CrudRepository<Business, Long>
{
}
這是模型:
@Table(name = "business")
public class Business
{
@Id
@Column(name = "business_id", nullable = false)
private Long id;
@JsonProperty("name")
private String name;
@Embedded
@JsonProperty("address")
private Address address;
@OneToMany(mappedBy = "business",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
@JsonProperty("operatives")
@JsonIgnore
Set<Professional> operatives;
@OneToOne(mappedBy = "business",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
optional = false)
@JsonBackReference
@JsonProperty("contact_numbers")
private CollectionOfContactMethods contact;
public Business()
{
}
// Getters and Setters
}
當我發送這樣的 POST 請求時:

我在哪里得到以下資訊
{ "timestamp": "2021-11-01T08:59:06.343 00:00", "status": 500, "error": "Internal Server Error", "path": "/api/v1/business/business " }
我除錯并得到InvocationTargetException如下所示這是控制器,就在 save() 之前,它似乎拋出:

這是捕獲:

I found this article posted in a similar event in StackOverflow but I don't think that's what is happening in this case since I have only H2 database for now. This is application.properties file :
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
spring.jpa.hibernate.hbm2ddl.auto=create
I would appreciate any ideas. Thanks for your time.
uj5u.com熱心網友回復:
如果您查看上一個螢屏截圖,您會看到一條訊息,表明有一個id沒有值的欄位。
在您的物體中,您的id欄位具有以下宣告:
@Id
@Column(name = "business_id", nullable = false)
private Long id;
這表明休眠它不應該生成密鑰或沒有分配給資料庫。這意味著您需要手動設定id. 如果你不這樣做,你會遇到這個例外。
現在我假設這是一個錯誤,并且您實際上想要一個序列或自動遞增的id欄位。為此,添加@GeneratedValue注釋以添加此行為。
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE))
@Column(name = "business_id", nullable = false)
private Long id;
這將指示 hibernateid在插入物體時使用序列來生成。如果你的資料庫支持identity的列,你可能需要使用GenerationType.IDENTITY替代GenerationType.SEQUENCE。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/343373.html
標籤:spring spring-boot spring-data-jpa spring-data spring-restcontroller
