【问题标题】:Should I construct Entity Bean in Controller?我应该在控制器中构造实体 Bean 吗?
【发布时间】:2015-01-16 14:37:24
【问题描述】:

我有一个@Service bean,其功能是将新的Member 实体保存到数据库:

@Service
public class AccountService {
    // method A
    public void saveMember(Member m) {
        entityManager.persit(m);
    }

    // method B
    public void saveMember(String username, String pwd, int age /* ... lots of parameters ... */) {
        Member m = new Member();
        m.setUsername(username);
        m.setPassword(pwd);
        // ... ...

        entityManager.persit(m);
    }
}

我会直接在@Controller bean 中调用saveMember()。哪种方法更好? 如果我使用方法A,那么我必须在@Controller bean 中构造Member 实体,如下所示:

@Controller
public class Controller {

    public String profile(@RequestParam String username,
                        @RequestParam String password
                        // ... ...
                        ) {
        Member m = new Member();
        m.setXXX();
        // ... ...
        // lots of setters method invocation
        accountService.saveMember(m);
    }
}

如果使用方法 B:

@Controller
public class Controller {

    public String profile(@RequestParam String username,
                        @RequestParam String password
                        // ... ...
                        ) {
        accountService.saveMember(username, password /* lots of parameters */);
    }
}

哪个更好? 谢谢!

【问题讨论】:

  • 我猜两者都是一样的,它只取决于你要使用的参数。 Member objectString 参数
  • @Kerppag 此应用程序将分发。也许方法 B 更好?
  • 就代码可读性而言,我认为方法 B 更好。顺便说一句,你在使用 Spring @Neo 吗?
  • 我建议选项 X。以上都不是。我是保护您的域的忠实拥护者,您的域只能从服务中访问。创建一个包含参数的对象,并使用该对象在服务内部构造一个成员。根据您的喜好,它可能是MemberDtoCreateMemberRequestCreateMemberCommand。这也解决了例如在哪里存储/离开verifyPassword 字段的问题(因为这通常不是Member 的一部分)。额外的好处是,您的架构现在更多地关注代码的意图。
  • @M.Deinum 感谢您的评论。我同意你的意见“domain should only be accessed from the services

标签: spring spring-mvc


【解决方案1】:

还有第三种方法

在您的控制器中,您将获得 Member 对象作为输入,您可以使用它来调用服务中的方法。

@RequestMapping(value = "/saveMember", method = RequestMethod.POST)
@ResponseBody
public String saveAddress(@RequestBody Member member) {
    accountService.saveMember(member);
    ....
}

以下是调用的 javascript 代码:

saveMember = function() {
    var saveURL = '/saveMember';

    var memberData = {};
    memberData.username = 'some user name';
    memberData.password = 'some password';
    .... (your other fields)

    $.ajax({
        url : saveURL,
        method : 'POST',
        dataType : 'json',
        contentType : 'application/json',
        data : JSON.stringify(memberData),
        success : function(result) {
            ...
        }, error: function(errorObject) {
            console.log(errorObject);
        }
    });
};

【讨论】:

  • public String saveAddress(@RequestBody Member member){}?使用@RequestBody 注释将导致org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported。我应该改用@ModalAttribute 吗?
  • 检查thisthis
  • 还有一件事您的 Member 类是可序列化的吗?? 如果不是,那么使用 Serializable 接口实现您的 Member 类并检查一次。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多