Всем привет.
Это RESTful приложение, которое должно выполнять следующие условия.
Вот сервис, который обрабатывает запрос POST("/car")
package ru.lanit.rest.service;
import ru.lanit.rest.dao.CarDAO;
import ru.lanit.rest.dao.PersonDAO;
import ru.lanit.rest.model.Car;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;
@RequestScoped
@Path("/car")
public class CarService {
@Inject
private CarDAO carDAO;
@Inject
private PersonDAO personDAO;
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Transactional
public Car addCar(Car car){
car.setOwner(personDAO.getPerson(car.getOwnerId()));
return carDAO.addCar(car);
}
}
Вот CarDAO, который работает с БД:
package ru.lanit.rest.dao;
import ru.lanit.rest.model.Car;
import sun.awt.image.ImageWatched;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@ApplicationScoped
public class CarDAO {
@Inject
private EntityManager entityManager;
@Inject
private StatisticsDAO statisticsDAO;
public Car getCar(Long id){
return entityManager.find(Car.class, id);
}
public Car addCar(Car car) {
statisticsDAO.getStatistics().incrementCarcount();
entityManager.merge(car);
entityManager.flush();
checkVendorUniqueness();
return entityManager.find(Car.class, car);
}
public Car updateCar(Car car){
entityManager.merge(car);
entityManager.flush();
checkVendorUniqueness();
return entityManager.find(Car.class, car);
}
public void deleteCar(Long id) throws Exception {
statisticsDAO.getStatistics().decrementCarcount();
entityManager.remove(entityManager.find(Car.class, id));
entityManager.flush();
checkVendorUniqueness();
}
public List<Car> getAllCars(){
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Car> carCriteriaQuery = cb.createQuery(Car.class);
return entityManager.createQuery(carCriteriaQuery).getResultList();
}
public void deleteAllCars() throws Exception {
ArrayList<Car> cars = (ArrayList<Car>)getAllCars();
while(!cars.isEmpty()){
deleteCar((long) (cars.size()-1));
}
}
private void checkVendorUniqueness(){
long uvc = 0;
LinkedList<Car> cars = (LinkedList<Car>)getAllCars();
LinkedList<String> vendors = new LinkedList<>();
while (!cars.isEmpty()){
String[] vendor = cars.getFirst().getModel().split("-");
vendors.add(vendor[0]);
cars.removeFirst();
}
for(int i = 0 ; i<vendors.size(); i++){
String vendor = vendors.get(i);
boolean match = false;
for (int j = i+1; i<vendors.size(); i++){
String vendorTwo = vendors.get(j);
if(vendor.equals(vendorTwo))
match = true;
}
if(!match)
uvc++;
}
statisticsDAO.getStatistics().setUniquevendorcount(uvc);
}
}
Сам класс Car:
package ru.lanit.rest.model;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Entity
@Table(name="car")
public class Car implements Serializable {
@Id
@NotNull
private Long id;
@Column(name = "model")
@NotNull
private String model;
@Column(name = "horse_power")
@NotNull
private Integer horsepower;
@NotNull
@ManyToOne
@JoinColumn(name = "owner_id")
private Person owner;
@NotNull
@Column(name = "ownerid")
private Long ownerId;
public Long getOwnerId() {
return ownerId;
}
public void setOwnerId(Long ownerId) {
this.ownerId = ownerId;
}
public Car(){}
public Car(Long id, String model, Integer horsepower, Long ownerId){
this.id = id;
this.model = model;
this.horsepower = horsepower;
this.ownerId = ownerId;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getModel() {
return model;
}
public void setModel(String model) {
if(model.matches("^[a-zA-Z0-9]+-[a-zA-Z0-9]+$"))
this.model = model;
}
public Integer getHorsepower() {
return horsepower;
}
public void setHorsepower(Integer horsepower) {
this.horsepower = horsepower;
}
public Person getOwner() {
return owner;
}
public void setOwner(Person owner) {
this.owner = owner;
}
}
Проблема, заключается в том, что при запросе POST /car в Postman и отправлении JSON команды:
{
"id":3,
"model":"BMW-X3",
"horsepower":200,
"ownerId":1
}
Выдаётся такая вот ошибка:
ERROR [io.undertow.request] (default task-3) UT005023: Exception handling request to /RESTfulCRUD/api/car: org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalArgumentException: Error occurred validating the Criteria
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76)
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212)
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Error occurred validating the Criteria
at org.hibernate.jpa.criteria.compile.CriteriaCompiler.compile(CriteriaCompiler.java:61)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:736)
at org.jboss.as.jpa.container.AbstractEntityManager.createQuery(AbstractEntityManager.java:116)
at ru.lanit.rest.dao.CarDAO.getAllCars(CarDAO.java:54)
at ru.lanit.rest.dao.CarDAO.checkVendorUniqueness(CarDAO.java:66)
at ru.lanit.rest.dao.CarDAO.addCar(CarDAO.java:33)
at ru.lanit.rest.dao.CarDAO$Proxy$_$$_WeldClientProxy.addCar(Unknown Source)
at ru.lanit.rest.service.CarService.addCar(CarService.java:31)
at ru.lanit.rest.service.CarService$Proxy$_$$_WeldSubclass.addCar$$super(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:49)
at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:77)
at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:92)
at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74)
at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
at ru.lanit.rest.service.CarService$Proxy$_$$_WeldSubclass.addCar(Unknown Source)
at ru.lanit.rest.service.CarService$Proxy$_$$_WeldClientProxy.addCar(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:296)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:250)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:237)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
... 32 more
Caused by: java.lang.IllegalStateException: No criteria query roots were specified
at org.hibernate.jpa.criteria.CriteriaQueryImpl.validate(CriteriaQueryImpl.java:273)
at org.hibernate.jpa.criteria.compile.CriteriaCompiler.compile(CriteriaCompiler.java:58)
... 69 more
Я так понял, проблема в CriteriaBuilder, CriteriaQuery и/или Root, но как решить её, я понять не могу.
Вопросы:
CarDAO, который был:
package ru.lanit.rest.dao;
import ru.lanit.rest.model.Car;
import sun.awt.image.ImageWatched;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@ApplicationScoped
public class CarDAO {
@Inject
private EntityManager entityManager;
@Inject
private StatisticsDAO statisticsDAO;
public Car getCar(Long id){
return entityManager.find(Car.class, id);
}
public Car addCar(Car car) {
statisticsDAO.getStatistics().incrementCarcount();
entityManager.merge(car);
entityManager.flush();
checkVendorUniqueness();
return entityManager.find(Car.class, car);
}
public Car updateCar(Car car){
entityManager.merge(car);
entityManager.flush();
checkVendorUniqueness();
return entityManager.find(Car.class, car);
}
public void deleteCar(Long id) throws Exception {
statisticsDAO.getStatistics().decrementCarcount();
entityManager.remove(entityManager.find(Car.class, id));
entityManager.flush();
checkVendorUniqueness();
}
public List<Car> getAllCars(){
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Car> carCriteriaQuery = cb.createQuery(Car.class);
return entityManager.createQuery(carCriteriaQuery).getResultList();
}
public void deleteAllCars() throws Exception {
ArrayList<Car> cars = (ArrayList<Car>)getAllCars();
while(!cars.isEmpty()){
deleteCar((long) (cars.size()-1));
}
}
private void checkVendorUniqueness(){
long uvc = 0;
LinkedList<Car> cars = (LinkedList<Car>)getAllCars();
LinkedList<String> vendors = new LinkedList<>();
while (!cars.isEmpty()){
String[] vendor = cars.getFirst().getModel().split("-");
vendors.add(vendor[0]);
cars.removeFirst();
}
for(int i = 0 ; i<vendors.size(); i++){
String vendor = vendors.get(i);
boolean match = false;
for (int j = i+1; i<vendors.size(); i++){
String vendorTwo = vendors.get(j);
if(vendor.equals(vendorTwo))
match = true;
}
if(!match)
uvc++;
}
statisticsDAO.getStatistics().setUniquevendorcount(uvc);
}
}
CarDAO, который стал:
package ru.lanit.rest.dao;
import ru.lanit.rest.model.Car;
import sun.awt.image.ImageWatched;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@ApplicationScoped
public class CarDAO {
@Inject
private EntityManager entityManager;
@Inject
private StatisticsDAO statisticsDAO;
public Car getCar(Long id){
return entityManager.find(Car.class, id);
}
public Car addCar(Car car) {
statisticsDAO.getStatistics().incrementCarcount();
entityManager.merge(car);
entityManager.flush();
checkVendorUniqueness();
return entityManager.find(Car.class, car.getId());
}
public Car updateCar(Car car){
entityManager.merge(car);
entityManager.flush();
checkVendorUniqueness();
return entityManager.find(Car.class, car.getId());
}
public void deleteCar(Long id) throws Exception {
statisticsDAO.getStatistics().decrementCarcount();
entityManager.remove(entityManager.find(Car.class, id));
entityManager.flush();
checkVendorUniqueness();
}
public List<Car> getAllCars(){
EntityManagerFactory entityManagerFactory = entityManager.getEntityManagerFactory();
CriteriaBuilder cb = entityManagerFactory.getCriteriaBuilder();
CriteriaQuery<Car> carCriteriaQuery = cb.createQuery(Car.class);
Root<Car> carRoot = carCriteriaQuery.from(Car.class);
carCriteriaQuery.select(carRoot);
return entityManager.createQuery(carCriteriaQuery).getResultList();
}
public void deleteAllCars() throws Exception {
LinkedList<Car> cars = (LinkedList<Car>)getAllCars();
while(!cars.isEmpty()){
deleteCar((long) (cars.size()-1));
}
}
private void checkVendorUniqueness(){
long uvc = 0;
ArrayList<Car> cars = (ArrayList<Car>) getAllCars();
LinkedList<String> vendors = new LinkedList<>();
while (!cars.isEmpty()){
String[] vendor = cars.get(cars.size()-1).getModel().split("-");
vendors.add(vendor[0]);
cars.remove(cars.size()-1);
}
for(int i = 0 ; i<vendors.size(); i++){
String vendor = vendors.get(i);
boolean match = false;
for (int j = i+1; i<vendors.size(); i++){
String vendorTwo = vendors.get(j);
if(vendor.equals(vendorTwo))
match = true;
}
if(!match)
uvc++;
}
statisticsDAO.getStatistics().setUniquevendorcount(uvc);
}
}
При изменениях в методах addCar(Car car), updateCar(Car car), getAllCars() программа полетела и доставила огромное удовольствие разработчику :)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пытаюсь авторизоваться на сайте с помощью POST, вываливает ошибка
В общем, не могу разобраться как сделать что-бы в файл записывался результат каждого цикла, а не последнего, подскажите, пожалуйста, как можно...
Использую следующую конструкцию