Sobes.tech
Senior
46

Aufgabenbeschreibung: Es ist erforderlich, einen REST-Endpunkt zu implementieren, um die Liste der Versicherungspolicen abzurufen, die einem bestimmten Kunden gehören und bezahlt sind. Da im System eine sehr große Anzahl von Policen vorhanden ist, sollte ein Parameter zur Begrenzung des Ergebnisses vorgesehen werden. @RestController public class ClientController { @Value("policy.limit") private int policyLimit; @Autowired private PolicyService policyService; @RequestMapping(path = "client/{clientId}/policies", method = RequestMethod.POST) public Response getClientPolicies(@PathVariable("clientId") String clientId) { List<PolicyDTO> policies = getPolicies().stream() .limit(policyLimit) .filter(p -> p.getClientIds().contains(clientId)) .filter(p -> p.isPaid()) .toList(); return new Response(policies); } @Transactional private List<PolicyDTO> getPolicies() { return policyService.getPolicies(); } @Data @AllArgsConstructor public class Response { private List<PolicyDTO> policies; } @Data public class PolicyDTO { private String id; private String name; private List<String> clientId; private Boolean isPaid; } @RequiredArgsConstructor @Component public class PolicyService { private PolicyDbRepository repository; List<PolicyDTO> getPolicies() { return repository.getPolicies(); } } public interface PolicyDbRepository { List<PolicyDTO> getPolicies(); }

Unternehmen wurden gefragt
Сбер лизинг

Antwort von AI

sobes.tech KI

В представленном коде есть несколько проблем:

  1. Метод getPolicies() загружает все полисы из базы, а затем фильтрация и ограничение результата происходит в памяти. Это неэффективно при большом объёме данных.
  2. Параметр policyLimit применяется до фильтрации, что может привести к возврату неполного или некорректного набора данных.
  3. HTTP метод POST не подходит для получения данных, лучше использовать GET.

Правильный подход — реализовать фильтрацию и лимитирование на уровне запроса к базе данных, чтобы выгружать только нужные полисы.

Пример исправленного контроллера:

@RestController
@RequestMapping("/client")
public class ClientController {

    @Autowired
    private PolicyService policyService;

    @GetMapping("/{clientId}/policies")
    public ResponseEntity<List<PolicyDTO>> getClientPolicies(
            @PathVariable String clientId,
            @RequestParam(defaultValue = "10") int limit) {
        List<PolicyDTO> policies = policyService.getPaidPoliciesByClient(clientId, limit);
        return ResponseEntity.ok(policies);
    }
}

@Service
public class PolicyService {

    @Autowired
    private PolicyDbRepository repository;

    public List<PolicyDTO> getPaidPoliciesByClient(String clientId, int limit) {
        return repository.findPaidPoliciesByClient(clientId, limit);
    }
}

public interface PolicyDbRepository {
    List<PolicyDTO> findPaidPoliciesByClient(String clientId, int limit);
}

В этом примере фильтрация и лимитирование делаются в репозитории, что позволяет эффективно работать с большими объёмами данных.