#java #spring-boot #maven #jpa #exception
#java #весенняя загрузка #maven #jpa #исключение
Вопрос:
Привет, разработчики, я пытался справиться с этим, но не могу найти логического решения. Я делаю это приложение с микросервисами, где наиболее важные элементы (арендаторы, продукты, арендная плата) являются микросервисом. Из-за этого и его зависимости друг от друга я также создал общую библиотеку, в которой повторное использование таблиц, необходимых нескольким компонентам приложения, является ее основной функцией.В качестве базы данных я использую MySQL. В одном из контроллеров микросервисов я получаю эту ошибку из-за конечной точки выборки всех продуктов:
org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String]
to type [java.lang.Long] for value 'all'; nested exception is java.lang.NumberFormatException: For input
string: "all"
Причина этой ошибки в контроллере продуктов, ссылающихся на это:
package com.microproducts.controllers;
import com.commons.dtos.ProductsDtos;
import com.commons.entities.Product;
import com.microproducts.exceptions.GeneralException;
import com.microproducts.exceptions.NotFoundException;
import com.microproducts.responses.AppResponse;
import com.microproducts.services.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RestController
public class ProductController {
@Autowired
ProductService productService;
@Autowired
ProductsDtos productsDtos;
@GetMapping("/products/all")==============================>APARENTLY HERE
public List<Product> getAllProducts() {
List<Product> allProducts = productService.getAllProducts().stream().collect(Collectors.toList());
return allProducts;
}
}
ПРИМЕЧАНИЕ: я поставил в качестве альтернативы, и ни одна из них не работает
@GetMapping(value="/products/all")
...
@GetMapping(path="/products/all")
...
@ResponseStatus(HttpStatus.OK)
@RequestMapping(value = "/products/all", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
...
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "products/all", method = RequestMethod.GET)
Как вы можете видеть в этой конечной точке, я не передаю параметр или что-то, что может вызвать странное поведение, поэтому все еще не могу понять это.
затем мои пакеты обслуживания и реализации, относящиеся к этому процессу, получили следующую структуру:
SERVICE
package com.microproducts.services;
import com.commons.entities.Product;
import java.util.List;
import java.util.Map;
public interface ProductService {
List<Product> getAllProducts();
}
SRVICE IMPLEMENTACION
package com.microproducts.servicesImpl;
import com.commons.dtos.ProductsDtos;
import com.commons.entities.Product;
import com.microproducts.exceptions.GeneralException;
import com.microproducts.exceptions.NotFoundException;
import com.microproducts.repositories.ProductRepository;
import com.microproducts.services.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
ProductRepository productRepository;
@Autowired
ProductsDtos productsDtos;
@Override
@Transactional(readOnly = true)
public List<Product> getAllProducts() {
List<Product> productsList = productRepository.findAll();
return productsList;
}
}
Repository and Entity of Product is designed in this way :
package com.microproducts.repositories;
import com.commons.entities.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}
In this case as Product entity is a reusable for other microservices i shared it in a package titled
commons
package com.commons.entities;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name="PRODUCT")
public class Product implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
Long id;
@Column(name="PRODUCT_NAME")
private String productName;
@OneToMany(fetch=FetchType.LAZY,mappedBy = "product")
private Set<Rent> listRentsInProduct=new HashSet<>();
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="RENTER_ID",nullable = false)
private Renter renter;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PRODUCT_TYPE_ID",nullable = false)
private ProductType productType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PRODUCT_PRICE_ID",nullable = false)
private ProductPrice productPrice;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PRODUCT_SUBTYPE_ID",nullable = false)
private ProductSubType productSubType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PRODUCT_INVENTARY_ID",nullable = false)
private ProductInventary productInventary;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="PRODUCT_FEE_DELAY_ID",nullable = false)
private ProductFeeDelay productFeeDelay;
private static final long serialVersionUID=1285454306356845809L;
/////////////////////////////constructor////////////////////////////
public Product(){};
public Product(Long id, String productName,
// Set<Rent> listRentsInProduct,
Renter renter, ProductType productType,ProductPrice productPrice,
ProductSubType productSubType, ProductInventary productInventary,
ProductFeeDelay productFeeDelay) {
this.id = id;
this.productName = productName;
this.listRentsInProduct = listRentsInProduct;
this.renter = renter;
this.productType = productType;
this.productPrice = productPrice;
this.productSubType = productSubType;
this.productInventary = productInventary;
this.productFeeDelay = productFeeDelay;
}
/////////////////////////other methods/////////////////////////////////
public void addRent(Rent rent){
listRentsInProduct.add(rent);
}
public Set<Rent>getAllRentsOfUser(){return listRentsInProduct;}
///////////////////////////getters and setters////////////////////////////////////
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getProductName() { return productName;}
public void setProductName(String productName) { this.productName = productName;}
public Set<Rent> getListRentsInProduct() { return listRentsInProduct; }
public void setListRentsInProduct(Set<Rent> listRentsInProduct) { this.listRentsInProduct = listRentsInProduct; }
public Renter getRenter() { return renter;}
public void setRenter(Renter renter) { this.renter = renter; }
public ProductType getProductType() { return productType; }
public void setProductType(ProductType productType) { this.productType = productType; }
public ProductPrice getProductPrice() { return productPrice;}
public void setProductPrice(ProductPrice productPrice) { this.productPrice = productPrice;}
public ProductSubType getProductSubType() { return productSubType;}
public void setProductSubType(ProductSubType productSubType) { this.productSubType = productSubType;}
public ProductInventary getProductInventary() { return productInventary;}
public void setProductInventary(ProductInventary productInventary) { this.productInventary = productInventary;}
public ProductFeeDelay getProductFeeDelay() { return productFeeDelay; }
public void setProductFeeDelay(ProductFeeDelay productFeeDelay) { this.productFeeDelay = productFeeDelay; }
@Override
public String toString() {
return "Product{"
"id=" id
", productName='" productName '''
", listRentsInProduct=" listRentsInProduct
", renter=" renter
", productType=" productType
", productPrice=" productPrice
", productSubType=" productSubType
", productInventary=" productInventary
", productFeeDelay=" productFeeDelay
'}';
}
}
And the Spring app configuration with the scan of all shareable components and entities gets exposed in this way:
package com.microproducts;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan({"com.commons.dtos","com.commons.entities","com.commons.exceptions","com.commons.responses"})
@EntityScan("com.commons.entities")
public class MicroproductsApplication {
public static void main(String[] args) {
SpringApplication.run(MicroproductsApplication.class, args);
}
}
despite of having the problem on that url of my controller i wanted to expose part of the code cause perhaps my structure isn’t correct or i’m omitting something which collaterally might caused the error.
But is quite rare that trying to fetch my data that mistake over that plain url string shows up cause of sort kind of background process pretending to mute the string or part of it to Long.
Any help, or opinion about which would be the path toward the solutions is great!!!!
Thanks in advance!!!.
Кстати, мой pom для этого микросервиса будет :
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.microproducts</groupId>
<artifactId>microproducts</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>microproducts</name>
<description>Demo project for microproducts</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
</properties>
<dependencies>
<!-- LIBRERIA COMUN-->
<dependency>
<groupId>com.commons</groupId>
<artifactId>commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
И более расширенный журнал ошибок через консоль выглядит следующим образом:
org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Long] for value 'all'; nested exception is java.lang.NumberFormatException: For input string: "all"
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:47) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:192) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:175) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.data.repository.support.ReflectionRepositoryInvoker.convertId(ReflectionRepositoryInvoker.java:293) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
at org.springframework.data.repository.support.ReflectionRepositoryInvoker.invokeFindById(ReflectionRepositoryInvoker.java:145) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
at org.springframework.data.repository.support.CrudRepositoryInvoker.invokeFindById(CrudRepositoryInvoker.java:92) ~[spring-data-commons-2.3.6.RELEASE.jar:2.3.6.RELEASE]
at org.springframework.data.rest.core.support.UnwrappingRepositoryInvokerFactory$UnwrappingRepositoryInvoker.invokeFindById(UnwrappingRepositoryInvokerFactory.java:94) ~[spring-data-rest-core-3.3.6.RELEASE.jar:3.3.6.RELEASE]
at org.springframework.data.rest.webmvc.RepositoryEntityController.getItemResource(RepositoryEntityController.java:514) ~[spring-data-rest-webmvc-3.3.6.RELEASE.jar:3.3.6.RELEASE]
at org.springframework.data.rest.webmvc.RepositoryEntityController.getItemResource(RepositoryEntityController.java:327) ~[spring-data-rest-webmvc-3.3.6.RELEASE.jar:3.3.6.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_221]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_221]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_221]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_221]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878) ~[spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792) ~[spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) [spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) [tomcat-embed-core-9.0.41.jar:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [tomcat-embed-core-9.0.41.jar:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) [spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) [spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_221]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_221]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.41.jar:9.0.41]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_221]
Caused by: java.lang.NumberFormatException: For input string: "all"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_221]
at java.lang.Long.parseLong(Long.java:589) ~[na:1.8.0_221]
at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_221]
at org.springframework.util.NumberUtils.parseNumber(NumberUtils.java:214) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:64) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.core.convert.support.StringToNumberConverterFactory$StringToNumber.convert(StringToNumberConverterFactory.java:50) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.core.convert.support.GenericConversionService$ConverterFactoryAdapter.convert(GenericConversionService.java:437) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
at org.springframework.core.convert.support.ConversionUtils.invokeConverter(ConversionUtils.java:41) ~[spring-core-5.2.12.RELEASE.jar:5.2.12.RELEASE]
... 58 common frames omitted
2020-12-19 10:42:06.389 WARN 7180 --- [nio-9000-exec-1] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.lang.Long] for value 'all'; nested exception is java.lang.NumberFormatException: For input string: "all"]
И это предварительный просмотр моей схемы базы данных и таблицы продуктов
Комментарии:
1. Не совсем понятно, что происходит, вы получаете ошибку при вызове конечной точки или при запуске приложения? В любом случае, можем ли мы, пожалуйста, попытаться убрать с пути пару вещей? Почему вы транслируете GetAllProducts ()? Вы могли бы просто вернуть это. Кроме того, вы не можете использовать метод findAll(), предоставляемый JpaRepository? В дополнение к этому я думаю, что все стандартные методы JpaRepository являются транзакционными, поэтому вам не нужно объявлять это явно. Не могли бы вы, пожалуйста, попробовать внедрить репозиторий в свой контроллер и попробовать вызвать findAll() прямо оттуда? Дайте мне знать.
2. Пожалуйста, поделитесь своими сведениями о таблице «Product», такими как имя столбца и его тип данных. Если бы вы предоставили снимок свойств таблицы из своей базы данных, это было бы более полезно.
3. это приложение основано на microservices (), по крайней мере, я пытаюсь сделать это таким образом… Таблица продуктов устанавливается в общей библиотеке, а затем импортируется в pom тех микросервисов, которым это может понадобиться ….. и уже используется совместно
4. #burm87 я просто пытаюсь сохранить как можно более чистую и организованную структуру кода, но, несмотря на это, сохранял тот же статус ошибки
5. @EnriqueGF у вас есть данные в вашей таблице? У вас такая же ошибка, если таблица пуста? Держу пари, что-то не так с вашей сущностью. Можете ли вы поделиться определением таблицы и ее столбцов?
Ответ №1:
- Вы используете одну и ту же таблицу в разных микросервисах. Это показатель того, что ваши микросервисы определены неправильно. Я предлагаю вам пересмотреть свою модель данных, проверить, какие данные принадлежат одному домену, какие принадлежат разным доменам. И только после этого определите службы. Тогда, возможно, вы увидите, что 2 или даже все 3 текущих микросервиса на самом деле должны быть одним микросервисом. Затем проверьте, как работает сохранение.
- Вызов
CrudRepositoryInvoker.invokeFindById()
означает, что былfindById()
вызван метод репозитория. Мы не видим весь код класса контроллера. Но я полагаю, что на самом деле существует 2 метода:
@GetMapping("/products/all")
public List<Product> getAllProducts() {
...
@GetMapping("/products/{id}")
public List<Product> getProductById(@PathVariable("id") Long id) {
...
Когда кто-то вызывает /products/all
, Spring рассматривает это как вызов /products/{id}
и пытается преобразовать all
в длинное значение. В результате мы видим, что трассировка стека отображается в OP.
В чем причина? Причина в плохом дизайне. Этот метод /products/all
делает всю службу неработоспособной.
Решение? Вот оно:
@GetMapping("/products")
public List<Product> getAllProducts() {
...
Комментарии:
1. Как это принятый ответ? Это всего лишь предложение по хорошему принципу проектирования (конечно, более чем приветствуется), но это определенно не приводит к возникновению исключения.
2. @burm87: Для меня это проблема XY. Нет смысла искать решение проблемы Y. Сначала нужно посмотреть на X поближе.
3. нет, но, тем не менее, ваш ответ не дает никакой помощи или понимания того, как решить подчеркнутую ошибку. Кто-то другой, столкнувшийся с такой же проблемой, не найдет решения в этом сообщении!
4. @burm87: Разве это не очевидно? Хорошо, я расширил свой ответ.
5. То, что очевидно для вас сейчас, не будет очевидно для кого-то, кто попадет на этот пост через два года. Спасибо за добавление деталей к вашему ответу.
Ответ №2:
Пожалуйста, добавьте альтернативу в контроллер и попробуйте.
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "products/all", method = RequestMethod.GET)
public List<Product> getAllProducts(HttpServletRequest request, HttpServletResponse response) {
List<Product> allProducts = productService.getAllProducts().stream().collect(Collectors.toList());
return allProducts;
}
Я думаю, вам не нужно добавлять findAll()
в репозиторий JPA, поскольку у него есть значение по умолчанию. вы можете прокомментировать это.
Комментарии:
1. я использовал подобную структуру до того, как вы прокомментировали это @HariKishore, и сохранил то же самое, но на самом деле спасибо, добавлю это к моим проблемам
Ответ №3:
По-видимому, в вашем проекте активирован spring-boot-starter-data-rest. С помощью этой библиотеки контроллеры rest волшебным образом получают специальные «значения», и ваша конечная точка / продукты / все теперь означает «вернуть продукт с идентификатором «все». Просто удалите эту зависимость из pom.xml , Я думаю, вам это не нужно.