2

私の意図は、Spring 3 MVC Web クライアントと Spring MVC REST プロバイダーも作成することです。

私の REST プロバイダーのコードは次のとおりです。

@RequestMapping("employee")
public class EmployeeController {
    @Autowired 
    EmployeeDAO empDao;

    @RequestMapping(value = "authenticateUser", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    public String authenticateUser(HttpServletRequest request, @RequestParam Employee employee) {
        String username = employee.getEmpCode();
        String password = employee.getPassword();

        String notExisting = "notExisting";
        String successLogin = "successLogin";
        String wrongPassword = "wrongPassword";

        Employee retrievedEmployee = empDao.getById(username);
        if(retrievedEmployee == null) {
            return notExisting;
        } else {
            if(retrievedEmployee.getPassword().equals(password)) {
                return successLogin;
            } else {
                return wrongPassword;
            }
        }
    }
}

ここに私のWebクライアントのコードがあります:

@Controller
public class UserAuthenticationController {
    private final static String SERVICEURL = "http://localhost:8080/cimweb";

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/userAuthentication", method = RequestMethod.POST)
    public @ResponseBody String userAuthentication(Locale locale, Model model, HttpServletRequest request) {
        Employee employee = new Employee();
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        employee.setEmpCode(username);
        employee.setPassword(password);

        // Prepare acceptable media type
        List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
        acceptableMediaTypes.add(MediaType.APPLICATION_JSON);

        HttpHeaders headers = new HttpHeaders();
        headers.setAccept(acceptableMediaTypes);
        HttpEntity<Employee> entity = new HttpEntity<Employee>(employee, headers);

        RestTemplate restTemplate = new RestTemplate();
        String url = SERVICEURL + "/employee/authenticateUser";
        try {
            ResponseEntity<Employee> result = restTemplate.exchange(url, HttpMethod.POST, entity, Employee.class);
        } catch(Exception e) {
            e.printStackTrace();
        }

        return "home";
    }
}

オブジェクト Employee を REST プロバイダーに渡して、それを処理し、REST プロバイダーからクライアントに文字列を返すことができるようにしたいだけです。

これをデバッグするたびに、プロバイダーに到達するとnullになります。

私は多くのことを見逃していることを知っており、いくつか読んだことがありますが、ほとんどの場合、オブジェクトではなくプロバイダーからの単純な要求です。

また、servlet-context.xml 内に配置する必要がある Bean はありますか?

4

1 に答える 1

5

問題の理由:

  1. を介してコントローラーでデータを受け取りたい場合は@RequestParam、リクエストにデータとリクエストパラメーターを含める必要があります。を含む URL と考えてください?empCode=xyz&password=abc。またはリクエスト本文でempCode=xyz&password=abc

  2. Employeeクライアントコードでオブジェクトを送信する方法で、オブジェクトはリクエストボディにシリアル化されます。提供されたコードを使用して、クライアントは、従業員オブジェクトをリクエスト本文の JSON 表現に変換してリクエストを行います。コントローラーメソッドが読み取る機能を備えていないもの。(クラスパスにジャクソンjarをマッピングしていると仮定します)

可能な解決策:

  1. の代わりにコントローラ メソッドのシグネチャを変更して、リクエスト ボディからオブジェクトの値を抽出する@RequestParamよう@RequestBodyに Spring に指示します。Employeeこれが json リクエストであることを検出し、コンテキスト内で JSON Http メッセージ コンバーターを探し、従業員オブジェクトを作成します。

  2. 2 番目のオプションは、コントローラーの署名を保持することですが、リクエストの作成方法を変更することです。クライアントで、インスタンスをインスタンス化した後RestTemplate、Form Http Message コンバーターをその converters プロパティに設定します。これにより、クライアントはフォーム送信のようにデータを POST するように指示されます。@RequestParamこれは、注釈付きのコントローラー メソッド引数によって読み取り可能になります。

お役に立てれば。

于 2013-08-02T15:39:35.850 に答える