Применение фильтра регулярных выражений в запросе GET с использованием кода Java, а не SQL - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть цель - получить отфильтрованные контакты из базы данных, используя Java, но не использовать SQL.Две проблемы:

  1. Тяжелый Java-код для использования базы данных.
  2. IllegalArgumentException: в цели запроса найден недопустимый символ.Допустимые символы определены в RFC 7230 и RFC 3986, потому что мне нужно использовать символы как ^, [,] и др.

Я не могу использовать регулярные выражения в SQL,только в Java.

Какие наилучшие способы решения этой проблемы?Мой код.

public class Contact {
    private int id;
    private String name;

    public Contact() {
    }

    public Contact(ResultSet resultSet) throws SQLException {
        setId(resultSet.getInt(1));
        setName(resultSet.getString(2));
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Contact [Id=" + id + ", Name=" + name + "]";
    }
} 

public class ManagementLayer {
    private static final Logger LOG = Logger.getLogger(String.valueOf(ManagementLayer.class));

    private ManagementLayer() {
    }

    private static class ManagementHolder{
        static final ManagementLayer Instance = new ManagementLayer();
    }

    public static synchronized ManagementLayer getInstance() {
        return ManagementHolder.Instance;
    }

    public List<Contact> getFilteredContacts(String regex, Connection dbConnection)
            throws SQLException, PatternSyntaxException {
        Pattern pattern = Pattern.compile(regex);
        List<Contact> contacts = new ArrayList<>();
        Statement statement = null;
        ResultSet resultSet = null;
        if (dbConnection == null) {
            try {
                Context context = new InitialContext();
                DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/hello");
                dbConnection = dataSource.getConnection();
            } catch (NamingException e) {
                LOG.info(e.getMessage());
            }
        }
        try {
            if (dbConnection != null) {
                statement = dbConnection.createStatement();
                statement.setFetchSize(1);
                resultSet = statement.executeQuery("SELECT * FROM contacts");
                while (resultSet.next()) {
                    String contactNameString = resultSet.getString(2);
                    Matcher matcher = pattern.matcher(contactNameString);
                    if (!matcher.matches()) {
                        Contact contact = new Contact();
                        contact.setId(resultSet.getInt(1));
                        contact.setName(contactNameString);
                        contacts.add(contact);
                    }
                }
            }
            System.out.println(contacts.toString());
        } finally {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
        }
        return contacts;
    }
}


@Path("contacts")
public class WebServiceLayer {
    private static final Logger LOG = Logger.getLogger(String.valueOf(WebServiceLayer.class));

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Contact> getNameFilter(@QueryParam("nameFilter") String val) {
        if (val == null || val.isEmpty()) {
            throw new WebApplicationException(Response
                    .status(HttpURLConnection.HTTP_BAD_REQUEST)
                    .entity("Error! Parameter is wrong or empty!")
                    .build());
        } else {
            List<Contact> contacts = new ArrayList<>();
            try {
                contacts = ManagementLayer
                        .getInstance()
                        .getFilteredContacts(val, null);
            } catch (SQLException e) {
                LOG.info(e.getMessage());
            }
            return contacts;
        }
    }
}

1 Ответ

0 голосов
/ 05 декабря 2018
  1. Я использовал ConcurrentHashMap для создания кэша из базы данных.
  2. В файл Tomcat server.xml добавлена ​​конфигурация (port = "8080" protocol = "HTTP / 1.1" URIEncoding = "UTF-8" connectionTimeout = "20000" redirectPort = "8443" relaxedQueryChars = '^ {}[] | $ * ').Также в сервлет добавлен URLDecoder.decode (val) для разрешения правильного преобразования закодированных символов в регулярное выражение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...