Dropwizard REST 问题
Dropwizard REST problems
我正在使用 dropwizard (jersey, jackson) 创建 REST API 并且偶然发现了一些我似乎无法找到答案的问题。
我想基于 json 文件构建 sql 查询。这将通过地图(标准、价值)来完成。我在意识到这一点时遇到了一些问题:
- 调用 DAO 方法 getUserByCriteria(Map/JSONObject) 会给我这种类型的错误:
UnsupportedOperationException:未找到已擦除类型 'interface java.util.Map[K, V]' 的类型参数。要绑定泛型,最好使用 bindByType。
或者 "No Argument factory" 错误,我似乎无法重现 atm
代码:
用户资源:
@POST
@Path("/list")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}
用户道:
List<User> getInvoiceByCriteria(@Bind("json") JSONObject json);
当我让它工作时,我将如何着手呢?我的代码看起来像这样(似乎无法为这个格式化代码块):
@SqlQuery("SELECT * FROM user LIMIT 10")
@RegisterRowMapper(UserMapper.class)
List getUserByCriteria(@Bind("json") Map json);
我想让它做这样的事情:
@SqlQuery("SELECT * FROM user WHERE crit1 = :crit1 AND crit2 = :crit2 LIMIT 10")
@RegisterRowMapper(UserMapper.class)
List<User> getUserByCriteria(@Bind("json") Map json){
//EXTRACT VALUES OF MAP HERE
//
};
我意识到这是一个非常模糊的问题。问题是我对这个 REST 东西是一个相当大的菜鸟,我遇到的问题并不常见(或者我正在寻找错误的东西)。
非常感谢任何help/insight!
关于 http/rest 的额外问题:
我觉得这应该是 GET 请求而不是 POST,但我的 Advanced Rest Client 不允许在 GET 请求中包含正文。我在网上发现通常不会这样做,但允许这样做。这里使用 POST 可以吗?
我将首先回答您的 Xtra 问题:
GET的objective是通过URI和URI中发送的params获取数据。 b/w 可以或应该有区别。这与使用 GET 的 Body 相同,您可以使用 GET 发送正文,但是您没有遵循 HTTP 指南,而且 GET 和 POST 的目的混合在一起。 <Refer Here> and <here>
现在进入你的问题。您正在
发送 JSONObject json
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}
但是你正在匹配地图。 Map 基本上是娱乐 TypeErasure < 这意味着在编译代码时,您的集合的泛型将被 this 的绑定对象替换> 您可以在必要时插入类型转换以保持类型安全。你也可以使用这样的东西
List<User> getInvoiceByCriteria(@Bind("json") Map<K extends String , V extends MyObject> json);
这是一个使用 Mapper 的 DAO 接口的简单示例:
@RegisterMapper(EmployeeMapper.class)
public interface EmployeeDao {
@SqlQuery("select * from employee;")
public List<Employee> getEmployees();
@SqlQuery("select * from employee where id = :id")
public Employee getEmployee(@Bind("id") final int id);
@SqlUpdate("insert into employee(name, department, salary) values(:name, :department, :salary)")
void createEmployee(@BindBean final Employee employee);
@SqlUpdate("update employee set name = coalesce(:name, name), " +
" department = coalesce(:department, department), salary = coalesce(:salary, salary)" +
" where id = :id")
void editEmployee(@BindBean final Employee employee);
@SqlUpdate("delete from employee where id = :id")
int deleteEmployee(@Bind("id") final int id);
@SqlQuery("select last_insert_id();")
public int lastInsertId();
}
这是上面使用的 Employee Mapper Class:
public class EmployeeMapper implements ResultSetMapper<Employee> {
private static final String ID = "id";
private static final String NAME = "name";
private static final String DEPARTMENT = "department";
private static final String SALARY = "salary";
public Employee map(int i, ResultSet resultSet, StatementContext statementContext)
throws SQLException {
Employee employee = new Employee(resultSet.getString(NAME), resultSet.getString(DEPARTMENT),resultSet.getInt(SALARY));
employee.setId(resultSet.getInt(ID));
return employee;
}
}
我已经在博客 post 上解释了如何使用 JDBI,通过简单的步骤在 Dropwizard 中创建 REST API,还有一个我在 GitHub 上创建的示例工作应用程序。请检查:http://softwaredevelopercentral.blogspot.com/2017/08/dropwizard-mysql-integration-tutorial.html
我正在使用 dropwizard (jersey, jackson) 创建 REST API 并且偶然发现了一些我似乎无法找到答案的问题。 我想基于 json 文件构建 sql 查询。这将通过地图(标准、价值)来完成。我在意识到这一点时遇到了一些问题:
- 调用 DAO 方法 getUserByCriteria(Map/JSONObject) 会给我这种类型的错误: UnsupportedOperationException:未找到已擦除类型 'interface java.util.Map[K, V]' 的类型参数。要绑定泛型,最好使用 bindByType。 或者 "No Argument factory" 错误,我似乎无法重现 atm
代码:
用户资源:
@POST
@Path("/list")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}
用户道:
List<User> getInvoiceByCriteria(@Bind("json") JSONObject json);
当我让它工作时,我将如何着手呢?我的代码看起来像这样(似乎无法为这个格式化代码块):
@SqlQuery("SELECT * FROM user LIMIT 10")
@RegisterRowMapper(UserMapper.class)
List getUserByCriteria(@Bind("json") Map json);
我想让它做这样的事情:
@SqlQuery("SELECT * FROM user WHERE crit1 = :crit1 AND crit2 = :crit2 LIMIT 10")
@RegisterRowMapper(UserMapper.class)
List<User> getUserByCriteria(@Bind("json") Map json){
//EXTRACT VALUES OF MAP HERE
//
};
我意识到这是一个非常模糊的问题。问题是我对这个 REST 东西是一个相当大的菜鸟,我遇到的问题并不常见(或者我正在寻找错误的东西)。 非常感谢任何help/insight!
关于 http/rest 的额外问题: 我觉得这应该是 GET 请求而不是 POST,但我的 Advanced Rest Client 不允许在 GET 请求中包含正文。我在网上发现通常不会这样做,但允许这样做。这里使用 POST 可以吗?
我将首先回答您的 Xtra 问题:
GET的objective是通过URI和URI中发送的params获取数据。 b/w 可以或应该有区别。这与使用 GET 的 Body 相同,您可以使用 GET 发送正文,但是您没有遵循 HTTP 指南,而且 GET 和 POST 的目的混合在一起。 <Refer Here> and <here>
现在进入你的问题。您正在
发送JSONObject json
public List<User> getUser(@Auth UserToken token, JSONObject json) {
return userDAO.getUserByCriteria(json);
}
但是你正在匹配地图。 Map 基本上是娱乐 TypeErasure < 这意味着在编译代码时,您的集合的泛型将被 this 的绑定对象替换> 您可以在必要时插入类型转换以保持类型安全。你也可以使用这样的东西
List<User> getInvoiceByCriteria(@Bind("json") Map<K extends String , V extends MyObject> json);
这是一个使用 Mapper 的 DAO 接口的简单示例:
@RegisterMapper(EmployeeMapper.class)
public interface EmployeeDao {
@SqlQuery("select * from employee;")
public List<Employee> getEmployees();
@SqlQuery("select * from employee where id = :id")
public Employee getEmployee(@Bind("id") final int id);
@SqlUpdate("insert into employee(name, department, salary) values(:name, :department, :salary)")
void createEmployee(@BindBean final Employee employee);
@SqlUpdate("update employee set name = coalesce(:name, name), " +
" department = coalesce(:department, department), salary = coalesce(:salary, salary)" +
" where id = :id")
void editEmployee(@BindBean final Employee employee);
@SqlUpdate("delete from employee where id = :id")
int deleteEmployee(@Bind("id") final int id);
@SqlQuery("select last_insert_id();")
public int lastInsertId();
}
这是上面使用的 Employee Mapper Class:
public class EmployeeMapper implements ResultSetMapper<Employee> {
private static final String ID = "id";
private static final String NAME = "name";
private static final String DEPARTMENT = "department";
private static final String SALARY = "salary";
public Employee map(int i, ResultSet resultSet, StatementContext statementContext)
throws SQLException {
Employee employee = new Employee(resultSet.getString(NAME), resultSet.getString(DEPARTMENT),resultSet.getInt(SALARY));
employee.setId(resultSet.getInt(ID));
return employee;
}
}
我已经在博客 post 上解释了如何使用 JDBI,通过简单的步骤在 Dropwizard 中创建 REST API,还有一个我在 GitHub 上创建的示例工作应用程序。请检查:http://softwaredevelopercentral.blogspot.com/2017/08/dropwizard-mysql-integration-tutorial.html