Добавлен вывод позиций найденных паттернов
This commit is contained in:
@@ -2,27 +2,21 @@ package ru.serega6531.packmate.controller;
|
|||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import ru.serega6531.packmate.model.CtfService;
|
|
||||||
import ru.serega6531.packmate.model.Pagination;
|
import ru.serega6531.packmate.model.Pagination;
|
||||||
import ru.serega6531.packmate.model.Stream;
|
import ru.serega6531.packmate.model.Stream;
|
||||||
import ru.serega6531.packmate.service.ServicesService;
|
|
||||||
import ru.serega6531.packmate.service.StreamService;
|
import ru.serega6531.packmate.service.StreamService;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/stream/")
|
@RequestMapping("/api/stream/")
|
||||||
public class StreamController {
|
public class StreamController {
|
||||||
|
|
||||||
private final StreamService streamService;
|
private final StreamService streamService;
|
||||||
private final ServicesService servicesService;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public StreamController(StreamService streamService, ServicesService servicesService) {
|
public StreamController(StreamService streamService) {
|
||||||
this.streamService = streamService;
|
this.streamService = streamService;
|
||||||
this.servicesService = servicesService;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/all")
|
@PostMapping("/all")
|
||||||
@@ -36,15 +30,10 @@ public class StreamController {
|
|||||||
|
|
||||||
@PostMapping("/{port}")
|
@PostMapping("/{port}")
|
||||||
public List<Stream> getStreams(@PathVariable int port, @RequestBody Pagination pagination) {
|
public List<Stream> getStreams(@PathVariable int port, @RequestBody Pagination pagination) {
|
||||||
final Optional<CtfService> serviceOptional = servicesService.findByPort(port);
|
if (pagination.isFavorites()) {
|
||||||
if (serviceOptional.isPresent()) {
|
return streamService.findFavoritesByService(pagination, port);
|
||||||
if (pagination.isFavorites()) {
|
|
||||||
return streamService.findFavoritesByService(pagination, serviceOptional.get());
|
|
||||||
} else {
|
|
||||||
return streamService.findAllByService(pagination, serviceOptional.get());
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return Collections.emptyList();
|
return streamService.findAllByService(pagination, port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,14 @@
|
|||||||
package ru.serega6531.packmate.model;
|
package ru.serega6531.packmate.model;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.ToString;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.Entity;
|
||||||
import java.util.List;
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name = "service")
|
@Table(name = "service")
|
||||||
@ToString(exclude = "streams")
|
|
||||||
public class CtfService {
|
public class CtfService {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@@ -18,8 +16,4 @@ public class CtfService {
|
|||||||
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
@OneToMany(mappedBy = "service", cascade = CascadeType.ALL, orphanRemoval = true)
|
|
||||||
@JsonIgnore
|
|
||||||
private List<Stream> streams;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
38
src/main/java/ru/serega6531/packmate/model/FoundPattern.java
Normal file
38
src/main/java/ru/serega6531/packmate/model/FoundPattern.java
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
package ru.serega6531.packmate.model;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import lombok.*;
|
||||||
|
import org.hibernate.annotations.GenericGenerator;
|
||||||
|
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.GeneratedValue;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@GenericGenerator(
|
||||||
|
name = "found_pattern_generator",
|
||||||
|
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
|
||||||
|
parameters = {
|
||||||
|
@org.hibernate.annotations.Parameter(name = "sequence_name", value = "found_pattern_seq"),
|
||||||
|
@org.hibernate.annotations.Parameter(name = "initial_value", value = "1"),
|
||||||
|
@org.hibernate.annotations.Parameter(name = "increment_size", value = "1")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
@Builder
|
||||||
|
@Getter
|
||||||
|
@ToString
|
||||||
|
public class FoundPattern {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(generator = "found_pattern_generator")
|
||||||
|
@JsonIgnore
|
||||||
|
private int id;
|
||||||
|
private int patternId;
|
||||||
|
private int startPosition;
|
||||||
|
private int endPosition;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -8,6 +8,7 @@ import lombok.NoArgsConstructor;
|
|||||||
import org.hibernate.annotations.GenericGenerator;
|
import org.hibernate.annotations.GenericGenerator;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@Entity
|
@Entity
|
||||||
@@ -42,6 +43,9 @@ public class Packet {
|
|||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private Stream stream;
|
private Stream stream;
|
||||||
|
|
||||||
|
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
|
||||||
|
private Set<FoundPattern> matches;
|
||||||
|
|
||||||
private long timestamp;
|
private long timestamp;
|
||||||
|
|
||||||
private boolean incoming; // true если от клиента к серверу, иначе false
|
private boolean incoming; // true если от клиента к серверу, иначе false
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.hibernate.annotations.GenericGenerator;
|
|||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@ToString(exclude = "packets")
|
@ToString(exclude = "packets")
|
||||||
@@ -26,13 +27,13 @@ public class Stream {
|
|||||||
@GeneratedValue(generator = "stream_generator")
|
@GeneratedValue(generator = "stream_generator")
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
@ManyToOne
|
@Column(name = "service_id")
|
||||||
@JoinColumn(name = "service_id", nullable = false)
|
private int service;
|
||||||
private CtfService service;
|
|
||||||
|
|
||||||
private Protocol protocol;
|
private Protocol protocol;
|
||||||
|
|
||||||
@OneToMany(mappedBy = "stream", cascade = CascadeType.ALL, orphanRemoval = true)
|
@OneToMany(mappedBy = "stream", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||||
|
@OrderColumn
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private List<Packet> packets;
|
private List<Packet> packets;
|
||||||
|
|
||||||
@@ -41,7 +42,7 @@ public class Stream {
|
|||||||
private long endTimestamp;
|
private long endTimestamp;
|
||||||
|
|
||||||
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
|
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
|
||||||
private List<Pattern> foundPatterns;
|
private Set<Pattern> foundPatterns;
|
||||||
|
|
||||||
private boolean favorite;
|
private boolean favorite;
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package ru.serega6531.packmate.repository;
|
|||||||
|
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import ru.serega6531.packmate.model.CtfService;
|
|
||||||
import ru.serega6531.packmate.model.Pattern;
|
import ru.serega6531.packmate.model.Pattern;
|
||||||
import ru.serega6531.packmate.model.Stream;
|
import ru.serega6531.packmate.model.Stream;
|
||||||
|
|
||||||
@@ -18,13 +17,13 @@ public interface StreamRepository extends JpaRepository<Stream, Long> {
|
|||||||
|
|
||||||
List<Stream> findAllByIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable);
|
List<Stream> findAllByIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdGreaterThanAndFavoriteIsTrue(CtfService service, long streamId, Pageable pageable);
|
List<Stream> findAllByServiceAndIdGreaterThanAndFavoriteIsTrue(int service, long streamId, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdLessThanAndFavoriteIsTrue(CtfService service, long streamId, Pageable pageable);
|
List<Stream> findAllByServiceAndIdLessThanAndFavoriteIsTrue(int service, long streamId, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(CtfService service, long streamId, Pattern pattern, Pageable pageable);
|
List<Stream> findAllByServiceAndIdGreaterThanAndFavoriteIsTrueAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(CtfService service, long streamId, Pattern pattern, Pageable pageable);
|
List<Stream> findAllByServiceAndIdLessThanAndFavoriteIsTrueAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByIdGreaterThan(long streamId, Pageable pageable);
|
List<Stream> findAllByIdGreaterThan(long streamId, Pageable pageable);
|
||||||
|
|
||||||
@@ -34,13 +33,13 @@ public interface StreamRepository extends JpaRepository<Stream, Long> {
|
|||||||
|
|
||||||
List<Stream> findAllByIdLessThanAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable);
|
List<Stream> findAllByIdLessThanAndFoundPatternsContaining(long streamId, Pattern pattern, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdGreaterThan(CtfService service, long streamId, Pageable pageable);
|
List<Stream> findAllByServiceAndIdGreaterThan(int service, long streamId, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdLessThan(CtfService service, long streamId, Pageable pageable);
|
List<Stream> findAllByServiceAndIdLessThan(int service, long streamId, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdGreaterThanAndFoundPatternsContaining(CtfService service, long streamId, Pattern pattern, Pageable pageable);
|
List<Stream> findAllByServiceAndIdGreaterThanAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable);
|
||||||
|
|
||||||
List<Stream> findAllByServiceAndIdLessThanAndFoundPatternsContaining(CtfService service, long streamId, Pattern pattern, Pageable pageable);
|
List<Stream> findAllByServiceAndIdLessThanAndFoundPatternsContaining(int service, long streamId, Pattern pattern, Pageable pageable);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,14 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.context.annotation.Lazy;
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
import ru.serega6531.packmate.model.FoundPattern;
|
||||||
import ru.serega6531.packmate.model.Pattern;
|
import ru.serega6531.packmate.model.Pattern;
|
||||||
import ru.serega6531.packmate.model.PatternType;
|
import ru.serega6531.packmate.model.PatternType;
|
||||||
import ru.serega6531.packmate.model.Stream;
|
import ru.serega6531.packmate.model.Stream;
|
||||||
import ru.serega6531.packmate.repository.PatternRepository;
|
import ru.serega6531.packmate.repository.PatternRepository;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -32,26 +34,61 @@ public class PatternService {
|
|||||||
log.info("Loaded {} patterns", patterns.size());
|
log.info("Loaded {} patterns", patterns.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Pattern find(int id) {
|
||||||
|
return patterns.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
public Collection<Pattern> findAll() {
|
public Collection<Pattern> findAll() {
|
||||||
return patterns.values();
|
return patterns.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Pattern> findMatching(byte[] bytes, boolean incoming) {
|
public Set<FoundPattern> findMatches(byte[] bytes, boolean incoming) {
|
||||||
String content = new String(bytes);
|
String content = new String(bytes);
|
||||||
|
|
||||||
return patterns.values().stream()
|
return patterns.values().stream()
|
||||||
.filter(p -> p.getType() == (incoming ? PatternType.INPUT : PatternType.OUTPUT)
|
.filter(p -> p.getType() == (incoming ? PatternType.INPUT : PatternType.OUTPUT)
|
||||||
|| p.getType() == PatternType.BOTH)
|
|| p.getType() == PatternType.BOTH)
|
||||||
.filter(pattern -> matches(pattern, content))
|
.map(pattern -> match(pattern, content))
|
||||||
.collect(Collectors.toList());
|
.flatMap(List::stream)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean matches(Pattern pattern, String content) {
|
private List<FoundPattern> match(Pattern pattern, String content) {
|
||||||
|
List<FoundPattern> found = new ArrayList<>();
|
||||||
|
|
||||||
if (pattern.isRegex()) {
|
if (pattern.isRegex()) {
|
||||||
final java.util.regex.Pattern regex = compilePattern(pattern);
|
final java.util.regex.Pattern regex = compilePattern(pattern);
|
||||||
return regex.matcher(content).find();
|
final Matcher matcher = regex.matcher(content);
|
||||||
|
|
||||||
|
while (matcher.find()) {
|
||||||
|
found.add(FoundPattern.builder()
|
||||||
|
.patternId(pattern.getId())
|
||||||
|
.startPosition(matcher.start())
|
||||||
|
.endPosition(matcher.end())
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
} else {
|
} else {
|
||||||
return StringUtils.containsIgnoreCase(content, pattern.getValue());
|
int startSearch = 0;
|
||||||
|
|
||||||
|
final String value = pattern.getValue();
|
||||||
|
while (true) {
|
||||||
|
int start = StringUtils.indexOfIgnoreCase(content, value, startSearch);
|
||||||
|
|
||||||
|
if (start == -1) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
int end = start + value.length() - 1;
|
||||||
|
found.add(FoundPattern.builder()
|
||||||
|
.patternId(pattern.getId())
|
||||||
|
.startPosition(start)
|
||||||
|
.endPosition(end)
|
||||||
|
.build());
|
||||||
|
|
||||||
|
startSearch = end + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,7 +105,7 @@ public class PatternService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pattern.getMatchedStreams().clear();
|
pattern.getMatchedStreams().clear();
|
||||||
patterns.remove(pattern.getId());
|
patterns.remove(id);
|
||||||
compiledPatterns.remove(pattern.getValue());
|
compiledPatterns.remove(pattern.getValue());
|
||||||
repository.delete(pattern);
|
repository.delete(pattern);
|
||||||
}
|
}
|
||||||
@@ -76,8 +113,9 @@ public class PatternService {
|
|||||||
|
|
||||||
public Pattern save(Pattern pattern) {
|
public Pattern save(Pattern pattern) {
|
||||||
log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue());
|
log.info("Добавлен новый паттерн {} со значением {}", pattern.getName(), pattern.getValue());
|
||||||
patterns.put(pattern.getId(), pattern);
|
final Pattern saved = repository.save(pattern);
|
||||||
return repository.save(pattern);
|
patterns.put(saved.getId(), pattern);
|
||||||
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
private java.util.regex.Pattern compilePattern(Pattern pattern) {
|
private java.util.regex.Pattern compilePattern(Pattern pattern) {
|
||||||
|
|||||||
@@ -50,9 +50,10 @@ public class ServicesService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public CtfService save(CtfService service) {
|
public CtfService save(CtfService service) {
|
||||||
log.info("Добавлен новый сервис {} на порту {}", service.getName(), service.getPort());
|
log.info("Добавлен или изменен сервис {} на порту {}", service.getName(), service.getPort());
|
||||||
services.put(service.getPort(), service);
|
final CtfService saved = repository.save(service);
|
||||||
return repository.save(service);
|
services.put(saved.getPort(), service);
|
||||||
|
return saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import java.io.ByteArrayOutputStream;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
import java.util.zip.ZipException;
|
import java.util.zip.ZipException;
|
||||||
|
|
||||||
@@ -85,7 +86,7 @@ public class StreamService {
|
|||||||
stream.setTtl(firstIncoming.isPresent() ? firstIncoming.get().getTtl() : 0);
|
stream.setTtl(firstIncoming.isPresent() ? firstIncoming.get().getTtl() : 0);
|
||||||
stream.setStartTimestamp(packets.get(0).getTimestamp());
|
stream.setStartTimestamp(packets.get(0).getTimestamp());
|
||||||
stream.setEndTimestamp(packets.get(packets.size() - 1).getTimestamp());
|
stream.setEndTimestamp(packets.get(packets.size() - 1).getTimestamp());
|
||||||
stream.setService(serviceOptional.get());
|
stream.setService(serviceOptional.get().getPort());
|
||||||
|
|
||||||
if (ignoreEmptyPackets) {
|
if (ignoreEmptyPackets) {
|
||||||
packets.removeIf(packet -> packet.getContent().length == 0);
|
packets.removeIf(packet -> packet.getContent().length == 0);
|
||||||
@@ -174,14 +175,19 @@ public class StreamService {
|
|||||||
|
|
||||||
Stream savedStream = save(stream);
|
Stream savedStream = save(stream);
|
||||||
|
|
||||||
Set<Pattern> matches = new HashSet<>();
|
Set<Pattern> foundPatterns = new HashSet<>();
|
||||||
|
|
||||||
for (ru.serega6531.packmate.model.Packet packet : packets) {
|
for (ru.serega6531.packmate.model.Packet packet : packets) {
|
||||||
packet.setStream(savedStream);
|
packet.setStream(savedStream);
|
||||||
matches.addAll(patternService.findMatching(packet.getContent(), packet.isIncoming()));
|
final Set<FoundPattern> matches = patternService.findMatches(packet.getContent(), packet.isIncoming());
|
||||||
|
packet.setMatches(matches);
|
||||||
|
foundPatterns.addAll(matches.stream()
|
||||||
|
.map(FoundPattern::getPatternId)
|
||||||
|
.map(patternService::find)
|
||||||
|
.collect(Collectors.toList()));
|
||||||
}
|
}
|
||||||
|
|
||||||
savedStream.setFoundPatterns(new ArrayList<>(matches));
|
savedStream.setFoundPatterns(foundPatterns);
|
||||||
savedStream.setPackets(packetService.saveAll(packets));
|
savedStream.setPackets(packetService.saveAll(packets));
|
||||||
savedStream = save(savedStream);
|
savedStream = save(savedStream);
|
||||||
|
|
||||||
@@ -277,7 +283,7 @@ public class StreamService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Stream> findFavoritesByService(Pagination pagination, CtfService service) {
|
public List<Stream> findFavoritesByService(Pagination pagination, int service) {
|
||||||
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id");
|
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id");
|
||||||
|
|
||||||
if (pagination.getPattern() != null) { // задан паттерн для поиска
|
if (pagination.getPattern() != null) { // задан паттерн для поиска
|
||||||
@@ -313,7 +319,7 @@ public class StreamService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Stream> findAllByService(Pagination pagination, CtfService service) {
|
public List<Stream> findAllByService(Pagination pagination, int service) {
|
||||||
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id");
|
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id");
|
||||||
|
|
||||||
if (pagination.getPattern() != null) { // задан паттерн для поиска
|
if (pagination.getPattern() != null) { // задан паттерн для поиска
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ spring:
|
|||||||
ddl-auto: update
|
ddl-auto: update
|
||||||
properties:
|
properties:
|
||||||
hibernate:
|
hibernate:
|
||||||
format_sql: true
|
# format_sql: true
|
||||||
temp:
|
temp:
|
||||||
use_jdbc_metadata_defaults: false
|
use_jdbc_metadata_defaults: false
|
||||||
show-sql: true
|
# show-sql: true
|
||||||
|
|
||||||
|
|
||||||
enable-capture: true
|
enable-capture: true
|
||||||
|
|||||||
Reference in New Issue
Block a user