首页 > 解决方案 > 使用 JAX-RS Servlet 获取请求不受支持的媒体错误

问题描述

在 Eclipse 中使用 JAX-RS,出现错误

HTTP 错误 415。

如果我从 "@Path("/TRData/{TR_ID}")" 中删除 "/{TR_ID]" 并且在 select 语句中没有 TR_ID,它可以正常工作并返回行。我想将返回的行限制为与数据库中的 TR_ID 匹配的单个行。TR_ID 的值由用户在 url 中给出,例如 ~/TRData/330377

我的类文件如下:

@Path("/TRData/{TR_ID}")
    @GET
    @Produces({ MediaType.APPLICATION_JSON })
    @Consumes({ MediaType.APPLICATION_JSON})
    public String getTRData(@PathParam("TR_ID") String TRID, @Context HttpServletRequest request, HttpServletResponse response) throws JSONException {

        String PNo = UMFactory.getAuthenticator().getLoggedInUser().getUniqueName();
        String TR_ID = TRID;


        try {

            System.err.println("Start TR Details");
            Class.forName("oracle.jdbc.driver.OracleDriver");

Connection con = DriverManager.getConnection("jdbc:oracle:thin:@ip:1521:mydb", "my_user", "myPassword");



String TRQuery="SELECT VTR.TRANSPORT_REQUEST_ID, VTR.PNO, (SELECT NAME FROM MR_HRS_EMPLOYEE WHERE REG_NO = VTR.PNO AND EMPLOYER_CODE = VTR.EMPLOYER_CODE) EMP_NAME, (SELECT DESIG_SHORT FROM MR_HRS_EMPLOYEE WHERE REG_NO = VTR.PNO AND EMPLOYER_CODE = VTR.EMPLOYER_CODE) DESIG_SHORT, VTR.STATUS, VTR.DRIVER_REQUIRED, VTR.PURPOSE_OF_VISIT, VTR.RECOMMENDED_BY, VTR.EMPLOYER_CODE, VTR.LOCATION_ID, VTR.FROM_TIME, VTR.TO_TIME, VTR.FROM_DATE, VTR.TO_DATE, VTR.CONTACT_NUMBER, VTR.AIRPORT_REQUEST, VTR.FLIGHT_NO, VTR.REQUEST_TYPE, VTR.REJECTED_BY, VTR.REMARKS, VTR.NO_OF_PASSENGERS FROM VMS.VMS_TRANSPORT_REQUEST VTR WHERE     VTR.STATUS = 'I' AND VTR.REQUEST_TYPE = 'O' AND VTR.DELETE_FLAG IS NULL AND VTR.RECOMMENDED_BY = " + PNo + " AND TRANSPORT_REQUEST_ID = " + TR_ID + " AND LOCATION_ID = (SELECT LOCATION_ID FROM MR.MR_HRS_EMPLOYEE WHERE REG_NO = " + PNo + ")";

            // Get AllTR Data from DB & Put it into JSON
                        System.err.println("Getting TR Data");
                        Statement TRStatement = con.createStatement();
                        ResultSet TRRecordSet = TRStatement.executeQuery(TRQuery);


                        ResultSetMetaData rsmd = TRRecordSet.getMetaData();

                        JSONArray TRjson = new JSONArray();

                        while (TRRecordSet.next()) {

                            JSONObject obj = new JSONObject();

                            int numColumns = rsmd.getColumnCount();

                            for (int i = 1; i <= numColumns; i++) {
                                String column_name = rsmd.getColumnName(i);
                                if (rsmd.getColumnType(i) == java.sql.Types.ARRAY) {
                                    obj.put(column_name, TRRecordSet.getArray(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.BIGINT) {
                                    obj.put(column_name, TRRecordSet.getInt(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.BOOLEAN) {
                                    obj.put(column_name, TRRecordSet.getBoolean(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.BLOB) {
                                    obj.put(column_name, TRRecordSet.getBlob(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.DOUBLE) {
                                    obj.put(column_name, TRRecordSet.getDouble(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.FLOAT) {
                                    obj.put(column_name, TRRecordSet.getFloat(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.INTEGER) {
                                    obj.put(column_name, TRRecordSet.getInt(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.NVARCHAR) {
                                    obj.put(column_name, TRRecordSet.getNString(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.VARCHAR) {
                                    obj.put(column_name, TRRecordSet.getString(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.TINYINT) {
                                    obj.put(column_name, TRRecordSet.getInt(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.SMALLINT) {
                                    obj.put(column_name, TRRecordSet.getInt(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.DATE) {
                                    obj.put(column_name, TRRecordSet.getDate(column_name));
                                } else if (rsmd.getColumnType(i) == java.sql.Types.TIMESTAMP) {
                                    obj.put(column_name, TRRecordSet.getTimestamp(column_name));
                                } else {
                                    obj.put(column_name, TRRecordSet.getObject(column_name));
                                }

                            }
                            TRjson.put(obj);

                        }

                        JSONObject mainObj = new JSONObject();

                        mainObj.put("trdata", TRjson);
            return mainObj.toString();

        }
        catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return e.getMessage() + "EX-MESSAGE";
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return e.getMessage() + "EX-MESSAGE";
        }

标签: javajax-rs

解决方案


您在@ContextHttpServletResponse 旁边失踪了。这是注射所需要的。此外,它是一个 GET 方法;不需要,@Consumes因为该方法不消耗任何东西。


推荐阅读