【问题标题】:Spring Boot how to query data without returning it?Spring Boot如何查询数据而不返回?
【发布时间】:2017-01-05 22:30:38
【问题描述】:

很抱歉问了这么一个新手问题!

我从 Spring Boot 的文档中知道,我可以这样做:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
    List<Person> findByLastName(@Param("name") String name);
}

但是我如何查询相同的信息,然后对其执行某种逻辑转换,然后再将其返回给客户端?

使用 findByLastName,直接从数据库返回结果。

【问题讨论】:

  • ...执行某种逻辑转换您可能想要做的更具体的示例可能会产生更多答案。
  • Spring Data Rest 为您提供投影和摘录以在一定程度上修改返回的数据,但正如 Alan 所说,您需要给出一个特定用例的示例。 docs.spring.io/spring-data/rest/docs/current/reference/html/…
  • 我所说的某种逻辑转换的意思是获取结果,并将它们分组到类别中,或者应用自定义排序功能或自定义过滤器,这会有所帮助。我的意思是基本上从数据库中获取结果集,然后在将结果集返回给客户端之前对结果集进行一些处理。例如,它可以像格式化日期值一样简单。

标签: spring spring-boot spring-data spring-data-rest


【解决方案1】:

我有类似的问题,据我了解,我和你没有方便的解决方案。 您将必须实现自己的控制器并在那里解决您的所有逻辑。 查看@RepositoryRestController 并使用您自己的逻辑实现您自己的方法。 解决方案我来了

@RestController
@RepositoryRestController
@RequestMapping(value = "/event/")
public class EventController {

    @Autowired
    EventService eventService;

    @RequestMapping(value = "/upcoming", method = RequestMethod.GET)
    List<EventProjection> checkIfUserParticipatesUpcoming(@RequestParam(value = "userId") String userId) {
            return eventService.checkIfUserParticipatesUpcoming(userId);
     }
}

在事件服务中完全实现业务逻辑,就像您通常在 spring 中所做的那样。

Spring-Data-Rest 非常适合基本的东西,但它不像你想要的那样有弹性。

如果有更好的答案,我也会很高兴听到它。

*请注意,我是个罪人。返回类型应该是 HttpEntity 与服务器 200/201/204 的兼容返回类型,但我只是处于开发阶段,尚未投入生产。 *

【讨论】:

  • 这种回答我的问题,事实上,它导致我找到了我正在寻找的答案。可能在调用服务方法的控制器中定义 requestMapping,该服务方法调用存储库中的方法之一。请参阅此示例:javabeat.net/spring-data-jpa
  • 这正是我所说的“在事件服务中完全实现业务逻辑,就像你通常在春天做的那样”。正如您在我的代码示例中看到的,我指的是真正的业务逻辑所属的服务
【解决方案2】:

在问了这个问题后,我随后找到了以下文档,其中概述了如何实现这一点:

http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.overriding-sdr-response-handlers

public class ScannerController {

    private final ScannerRepository repository;

    @Autowired
    public ScannerController(ScannerRepository repo) { 
        repository = repo;
    }

    @RequestMapping(method = GET, value = "/scanners/search/listProducers") 
    public @ResponseBody ResponseEntity<?> getProducers() {
        List<String> producers = repository.listProducers(); 

        //
        // do some intermediate processing, logging, etc. with the producers
        //

        Resources<String> resources = new Resources<String>(producers); 

        resources.add(linkTo(methodOn(ScannerController.class).getProducers()).withSelfRel()); 

        // add other links as needed

        return ResponseEntity.ok(resources); 
    }

}

注意:您还必须导入以下包才能使其正常工作:

import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2018-10-02
    • 2018-02-11
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多