org.glassfish.jersey.server.model.ModelValidationException:应用程序初始化期间应用程序资源模型的validation失败

我正在从链接开发spring boot微服务示例: https : //dzone.com/articles/spring-boot-creating 。 在这个项目中,我只是将父依赖项更新为其最新版本,其他代码文件保持不变。 当我点击http:// localhost:8080 / order?idCustomer = 2&idProduct = 3&amount = 4时遇到以下错误

2016-09-09 11:46:20.888 ERROR 14152 --- [nio-8080-exec-1] oaccC[Tomcat].[localhost].[/] : StandardWrapper.Throwable org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization. [[FATAL] A resource model has ambiguous (sub-)resource method for HTTP method GET and input mime-types as defined by"@Consumes" and "@Produces" annotations at Java methods public java.util.List br.com.alexandreesl.handson.rest.ProductRest.getProducts() and public java.util.List br.com.alexandreesl.handson.rest.CustomerRest.getCustomers() at matching regular expression /. These two methods produces and consumes exactly the same mime-types and therefore their invocation as a resource methods will always fail.; source='org.glassfish.jersey.server.model.RuntimeResource@14c14bf'] at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:555) ~[jersey-server-2.23.1.jar:na] at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184) ~[jersey-server-2.23.1.jar:na] at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350) ~[jersey-server-2.23.1.jar:na] at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347) ~[jersey-server-2.23.1.jar:na] at org.glassfish.jersey.internal.Errors.process(Errors.java:315) ~[jersey-common-2.23.1.jar:na] at org.glassfish.jersey.internal.Errors.process(Errors.java:297) ~[jersey-common-2.23.1.jar:na] at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) ~[jersey-common-2.23.1.jar:na] at org.glassfish.jersey.server.ApplicationHandler.(ApplicationHandler.java:347) ~[jersey-server-2.23.1.jar:na] at org.glassfish.jersey.servlet.WebComponent.(WebComponent.java:392) ~[jersey-container-servlet-core-2.23.1.jar:na] at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177) ~[jersey-container-servlet-core-2.23.1.jar:na] at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369) ~[jersey-container-servlet-core-2.23.1.jar:na] at javax.servlet.GenericServlet.init(GenericServlet.java:158) ~[tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1194) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:806) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:133) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) [tomcat-embed-core-8.5.4.jar:8.5.4] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.4.jar:8.5.4] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_102] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_102] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.4.jar:8.5.4] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102] 

更新的pom.xml

  org.springframework.boot spring-boot-starter-parent 1.4.0.RELEASE   UTF-8 1.8    org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-jersey   junit junit test   

Application.java

 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

ApplicationConfig.java

 @Configuration public class ApplicationConfig { @Named static class JerseyConfig extends ResourceConfig { public JerseyConfig() { this.packages("br.com.alexandreesl.handson.rest"); } } @Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); return restTemplate; } } 

Order.java

 public class Order { private long id; private long amount; private Date dateOrder; private Customer customer; private Product product; // setters and getters } 

OrderRest.java

 @Named @Path("/") public class OrderRest { private long id = 1; @Inject private RestTemplate restTemplate; @GET @Path("order") @Produces(MediaType.APPLICATION_JSON) public Order submitOrder(@QueryParam("idCustomer") long idCustomer, @QueryParam("idProduct") long idProduct, @QueryParam("amount") long amount) { Customer customer = restTemplate.getForObject("http://localhost:8080/customer?id={id}", Customer.class, idCustomer); Product product = restTemplate.getForObject("http://localhost:8080/product?id={id}", Product.class,idProduct); Order order = new Order(); order.setCustomer(customer); order.setProduct(product); order.setId(id); order.setAmount(amount); order.setDateOrder(new Date()); id++; return order; } } 

Customer.java

 public class Customer { private long id; private String name; private String email; // setters and getters } 

CustomerRest.java

 @Named @Path("/") public class CustomerRest { private static List customers = new ArrayList(); static { Customer customer1 = new Customer(); customer1.setId(1); customer1.setNome("Customer 1"); customer1.setEmail("customer1@gmail.com"); Customer customer2 = new Customer(); customer2.setId(2); customer2.setNome("Customer 2"); customer2.setEmail("Customer2@gmail.com"); Customer customer3 = new Customer(); customer3.setId(3); customer3.setNome("Customer 3"); customer3.setEmail("Customer3@gmail.com"); Customer customer4 = new Customer(); customer4.setId(4); customer4.setNome("Customer 4"); customer4.setEmail("Customer4@gmail.com"); Customer customer5 = new Customer(); customer5.setId(5); customer5.setNome("Customer 5"); customer5.setEmail("Customer5@gmail.com"); customers.add(customer1); customers.add(customer2); customers.add(customer3); customers.add(customer4); customers.add(customer5); } @GET @Produces(MediaType.APPLICATION_JSON) public List getCustomers() { return customers; } @GET @Path("customer") @Produces(MediaType.APPLICATION_JSON) public Customer getCustomer(@QueryParam("id") long id) { Customer cli = null; for (Customer c : customers) { if (c.getId() == id) cli = c; } return cli; } } 

Product.java

 public class Product { private long id; private String sku; private String description; // setters and getters } 

ProductRest.java

 @Named @Path("/") public class ProductRest { private static List products = new ArrayList(); static { Product product1 = new Product(); product1.setId(1); product1.setSku("abcd1"); product1.setDescription("Product1"); Product product2 = new Product(); product2.setId(2); product2.setSku("abcd2"); product2.setDescription("Product2"); Product product3 = new Product(); product3.setId(3); product3.setSku("abcd3"); product3.setDescription("Product3"); Product product4 = new Product(); product4.setId(4); product4.setSku("abcd4"); product4.setDescription("Product4"); products.add(product1); products.add(product2); products.add(product3); products.add(product4); } @GET @Produces(MediaType.APPLICATION_JSON) public List getProducts() { return products; } @GET @Path("product") @Produces(MediaType.APPLICATION_JSON) public Product getProduct(@QueryParam("id") long id) { Product prod = null; for (Product p : products) { if (p.getId() == id) prod = p; } return prod; } } 

请指导这个问题。

我能够解决这个问题。 您需要在映射请求URL中进行一些更改。 我想知道块中的代码是如何正常工作的。

根据我的理解,一个可能的原因是您有两个或更多适用于该URL调用的映射。 CustomerRest.javaProductRest.java都映射到/

 @Path("/") 

 @Path("/") 

Jersey无法告诉实际应该调用哪种方法并给出了这个错误。

您需要更正以下文件: OrderRest.java

 @Named @Path("/") public class OrderRest { private long id = 1; @Inject private RestTemplate restTemplate; @GET @Path("order") @Produces(MediaType.APPLICATION_JSON) public Order submitOrder(@QueryParam("idCustomer") long idCustomer, @QueryParam("idProduct") long idProduct, @QueryParam("amount") long amount) { Customer customer = restTemplate.getForObject("http://localhost:8080/customer/getCustomer?id={id}", Customer.class, idCustomer); Product product = restTemplate.getForObject("http://localhost:8080/product/getProduct?id={id}", Product.class,idProduct); Order order = new Order(); order.setCustomer(customer); order.setProduct(product); order.setId(id); order.setAmount(amount); order.setOrderDate(new Date()); id++; return order; } } 

CustomerRest.java中 – 使用它

 @GET @Path("/getCustomer") @Produces(MediaType.APPLICATION_JSON) public Customer getCustomer(@QueryParam("id") long id) { Customer cli = null; for (Customer c : customers) { if (c.getId() == id) cli = c; } return cli; } 

ProductRest中 – 使用它

 @GET @Path("/getProduct") @Produces(MediaType.APPLICATION_JSON) public Product getProduct(@QueryParam("id") long id) { Product prod = null; for (Product p : products) { if (p.getId() == id) prod = p; } return prod; } 

这是输出: 在此处输入图像描述