为啥 Rest Controller 会给出错误:“处理程序没有适配器”?

Posted

技术标签:

【中文标题】为啥 Rest Controller 会给出错误:“处理程序没有适配器”?【英文标题】:Why does the Rest Controller give an error : "No adapter for handler"?为什么 Rest Controller 会给出错误:“处理程序没有适配器”? 【发布时间】:2022-01-11 00:09:47 【问题描述】:

我想做一个简单的spring与MongoDB交互的例子。 我有一个产品型号:

@NoArgsConstructor
@ToString(exclude = "id")
public class Product 
    @Id
    private String id;
    private String name;
    private Integer price;
    private LocalDateTime localDateTime;

    public Product(String name, Integer price, LocalDateTime localDateTime) 
        this.name = name;
        this.price = price;
        this.localDateTime = localDateTime;
    


一个简单的存储库和一个使用 DB 的服务:

public interface productRepository extends MongoRepository<Product,String> 
    Product findByName(String name);
    List<Product> findByPrice(Integer price);


服务

@AllArgsConstructor
@Service
public class productServiceImpl implements productService<Product>

    productRepository repository;

    @Override
    public Product saveOrUpdateProduct(Product product) 
        return repository.save(product);
    

    @Override
    public List<Product> findAll() 
        return repository.findAll();
    

    @Override
    public Product findByName(String name) 
        return repository.findByName(name);
    

    @Override
    public List<Product> findByPrice(Integer price) 
        return repository.findByPrice(price);
    


当我检查 findAll 的工作时,一切正常。但是在使用 Rest Service 时:


@RestController("/products")
@AllArgsConstructor
public class productRestController 


    productServiceImpl productService;

    @GetMapping("/")
    public List<Product> getAllProducts()
        System.out.println("*********************inside get all ***********************");
        return productService.findAll();
    

    @GetMapping("/products/name")
    public Product getProductsByName(@PathVariable("name")Optional<String> name )
        if(name.isPresent())
            return productService.findByName(name.get());
        else return null;
    

    @GetMapping("/products/price")
    public List<Product> getProductsByPrice(@PathVariable("price")Optional<Integer> price )
        if(price.isPresent())
            return productService.findByPrice(price.get());
        else return null;
    

    @PostMapping("/save")
    public ResponseEntity<?> saveProduct(@RequestBody Product product)
        Product p = productService.saveOrUpdateProduct(product);
        return new ResponseEntity(p, HttpStatus.OK);
    



然后打电话给http://localhost:8080/products/我得到一个错误:

No adapter for handler [com.example.MongoTesr.REST.productRestController@6e98d209]: 
The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler

我尝试谷歌,但没有找到错误和问题的解决方案。你能告诉我我做错了什么吗?

application.propertires

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.username=root
spring.data.mongodb.password=rootpassword
spring.data.mongodb.database=test_db
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost

【问题讨论】:

【参考方案1】:

@RestController("/products") 没有按照你的想法做!

/products 不是路径或映射到它或类似的,而只是:

该值可能表示对逻辑组件名称的建议,在自动检测到组件的情况下将其转换为 Spring bean。

来自RestController.value javadoc。


如果我们想在类级别构建路径映射,我们可以通过以下方式实现:

...
@RestController  // resp. @Controller
@RequestMapping("/products") //(resp. relative: "products")
public class ...

另见:Using @RequestMapping on class level

【讨论】:

以上是关于为啥 Rest Controller 会给出错误:“处理程序没有适配器”?的主要内容,如果未能解决你的问题,请参考以下文章

查询给出错误的结果。知道为啥会这样吗?

为啥 Django Rest Framework 不鼓励模型级别验证?

为啥此代码会给出错误 Expected ',' 分隔符? [关闭]

为啥 Pydev 会给出内置关键字的语法错误?

为啥对非指针结构进行类型转换会给出语法错误

whitelabel 错误页面 404 spring boot 微服务 Rest Controller