相关疑难解决方法(0)

REST API - DTO或不是?

我目前正在为一个项目创建一个REST-API,并且正在阅读关于最佳实践的文章.许多人似乎反对DTO,只是暴露域模型,而其他人似乎认为DTO(或用户模型或任何你想称之为的)是不好的做法.就个人而言,我认为这篇文章很有意义.

但是,我也理解DTO的缺点,包括所有额外的映射代码,可能与其DTO对应物100%相同的域模型等等.

我们的API主要是为了让其他客户端可以使用数据而创建的,但是如果我们做得对,我们也希望尽可能将它用于我们自己的Web GUI.

问题是我们可能不希望将所有域数据公开给其他客户端用户.大部分数据只在我们自己的Web应用程序中才有意义.此外,我们可能不希望在所有方案中公开有关对象的所有数据,尤其是与其他对象的关系等.例如,如果我们公开特定对象的列表,我们不一定要暴露整个对象层次结构; 这样对象的孩子就不会暴露,但可以通过链接(hateoas)发现.

我该如何解决这个问题?我正在考虑在我们的域模型上使用Jackson mixins来控制在给定不同场景的情况下会暴露哪些数据.或者我们应该一直使用DTO - 即使考虑到它的缺点和争议?

java rest spring dto hateoas

133
推荐指数
4
解决办法
6万
查看次数

在创建,更新和获取休息终点时相同/不同的DTO对象?

考虑使用UserDTO类和UserController公开端点来创建,更新和获取用户.

在UserDTO类中具有id属性对于创建和更新没有意义.如果我使用swagger或其他自动生成的API文档,那么它会显示id可以在create end point中传递.但系统不使用它,因为ID是在内部生成的.

如果我看看get那么可能我可以摆脱id属性,但它肯定是在列表用户端点.

我想在get/list端点返回内部用户域对象.这样我就可以从UserDTO类中删除id属性.

我可以为此采用更好的选择吗?

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

    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;
    }
}

@RestController
@RequestMapping(value = "/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
    public ResponseEntity<Void> create(@RequestBody UserDTO user) {
    }

    @RequestMapping(value = "{id}", method = RequestMethod.GET)
    @ResponseBody
    public …
Run Code Online (Sandbox Code Playgroud)

java rest spring-mvc dto content-negotiation

13
推荐指数
2
解决办法
9264
查看次数

使用JAX-RS和Jackson将JPA实体转换为REST表示的最佳方法

我正在寻找一种方法将一些JPA实体导出到REST API,但是每次我想根据入口点分享一些特定的字段时,不是发送整个实体.这是一个小例子:

假设我们有一个Author几个字段的类:

@Entity
public class Author implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = SEQUENCE)
    private Long id;

    @NotNull
    @Size(min = 1, message = "{required.field}")
    private String name;

    @NotNull
    @Size(min = 1, message = "{required.field}")
    private String country;

    private LocalDate birthDate;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

并说我们有这个REST服务(只有两种方法):

@Path("authors")
public class AuthorREST {

    @Inject
    private AuthorBC bc;

    @GET
    @Produces("application/json")
    public List<Author> find(@QueryParam("q") String query) throws Exception {

        List<Author> result;

        if (Strings.isEmpty(query)) {
            result = …
Run Code Online (Sandbox Code Playgroud)

java rest jpa jax-rs jackson

5
推荐指数
2
解决办法
4869
查看次数

标签 统计

java ×3

rest ×3

dto ×2

content-negotiation ×1

hateoas ×1

jackson ×1

jax-rs ×1

jpa ×1

spring ×1

spring-mvc ×1