Контроль версий для Java сервлета - PullRequest
0 голосов
/ 07 ноября 2018

Нам нужно применить контроль версий для нашего API, когда пользователь отправляет запрос на нашу конечную точку API, т. Е. "http://mycompany/item?version=1", он перенаправляет запрос на itemServer_V1.java.

Для достижения этой цели мы настроили наш web.xml следующим образом.

<servlet>
    <servlet-name>item</servlet-name>
    <servlet-class>com.mycompany.Servlet.ItemRequestHandler</servlet-class>

</servlet>
<servlet-mapping>
    <servlet-name>item</servlet-name>
    <url-pattern>/item</url-pattern>
</servlet-mapping>

Создаем таблицу в базе данных MySQL.

таблица базы данных

ItemRequestHandler - это класс, который расширяет HttpServlet, и он должен перенаправлять запрос в ItemServiceV1 или ItemServiceV2 в соответствии с параметром версии в запросе.

Я закончил класс ItemService, но не знаю, как переслать запрос из ItemRequestHandler в класс ItemService. Может кто-нибудь дать мне знать, как это сделать, пожалуйста?

Класс ItemRequestHandler выглядит следующим образом

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException , IOException
{
    String version = req.getParameter("version");
    String fcd = req.getParameter("fcd");
    String client = req.getParameter("client");

    //Find the targetClass from database using the above information.
    targetClass.doGet(req, res); 
}

1 Ответ

0 голосов
/ 08 ноября 2018

Я найду решение.

protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    System.out.println("LoginRequestHandler doPost");
    String className = "";
    String version = "";
    String fcd = "login";
    String compid = "";

    RequestWrapper currentReq = new RequestWrapper(req);

    version = currentReq.getParameter("Version");
    compid = currentReq.getParameter("Compid ");

    try {       
        className = findServletByVersion(compid, version, fcd);

        Class<?> serviceClass = Class.forName(className);           
        Method method = serviceClass.getDeclaredMethod(MethodName.doPost.toString(), HttpServletRequest.class, HttpServletResponse.class);
        method.invoke(serviceClass.newInstance(), currentReq, res);

        return;
    }catch(Exception e) {
        System.out.println(e.toString());
    } catch (DataNotFound e) {
        System.out.println(e.toString());
    }
}

}

Код запросаWrapper

    public class RequestWrapper extends HttpServletRequestWrapper {

    private String _body;

    public RequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        _body = "";
        BufferedReader bufferedReader = request.getReader();           
        String line;
        while ((line = bufferedReader.readLine()) != null){
            _body += line;
        }
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(_body.getBytes());
        return new ServletInputStream() {
            public int read() throws IOException {
                return byteArrayInputStream.read();
            }
        };
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }
}

Код findServletByVersion

    public String findServletByVersion(String compid, String version, String fcd) throws SQLException, ClassNotFoundException, DataNotFound {

    String clsName = "";
    Connection con = null;
    Statement stmt = null;      
    User user = null;
    try {

        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://YourIpAddress:PortNum/"+schemaName,"account","password");
        String query = "SELECT * FROM "+compid+".restfcd "
                + "WHERE 1=1 "
                + "AND compid = '"+compid+"'"
                + "AND version = '"+version+"'"
                + "AND fcd = '"+fcd+"'"
                + "ORDER BY compid desc";

        System.out.println(query);
        stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery(query);

        if(rs!=null) {
            while (rs.next()) {             
                clsName = rs.getString("fcdcls");            
            }
        }

        if(Func.isEmpty(clsName)) {
            throw new DataNotFound("findServletByVersion : no match result!");
        }

        return clsName;

    } catch (SQLException e) {
        throw new SQLException("findServletByVersion : SQLException!");
    } catch (ClassNotFoundException e) {
        throw new ClassNotFoundException("findServletByVersion : ClassNotFoundException!");

    } finally {
        try {
            con.close();
            stmt.close();
        } catch (SQLException sqlee) {
            throw new SQLException("Cannot close conection/statement!");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...