【问题标题】:using @pathvariable with @restController将@pathvariable 与@restController 一起使用
【发布时间】:2018-06-11 09:19:16
【问题描述】:

我目前正在专门学习 Spring MVC @restController,我遇到了一个 问题是我不知道如何处理它。这是我的代码

package com.kh.myapp.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.kh.myapp.member.service.MemberService;
import com.kh.myapp.member.vo.MemberVO;

@RestController
@RequestMapping("/hello")
public class RestfulController {
    @Autowired
    @Qualifier("memberServiceImplXML")
    MemberService ms;

    @RequestMapping("/hello")
    public String hello() {
        return "hello";
    }

    /*@RequestMapping(value = "/member", produces = "application/json")
    public MemberVO member(@RequestParam("id") String id) {
        MemberVO mv = new MemberVO();
        mv = ms.getMemberByID(id);

        return mv;
    }*/

    @RequestMapping(value = "/member/{id:.+}", method = RequestMethod.GET)
    public MemberVO member(@PathVariable String id) {
        MemberVO mv = new MemberVO();
        mv = ms.getMemberByID(id);

        return mv;
    }

    @RequestMapping(value = "/memberXML", method = RequestMethod.GET, produces = "application/json")
    public MemberVO memberXML(HttpServletRequest request) {
        String id = request.getParameter("id");
        MemberVO mv = new MemberVO();
        mv = ms.getMemberByID(id);

        return mv;
    }

    @RequestMapping(value = "/memberList")
    public List<MemberVO> memberList() {

        List<MemberVO> list = ms.getMembers();
        return list;
    }

    @RequestMapping("/memberMap")
    public Map<Integer, MemberVO> memberMap(){
        Map<Integer, MemberVO> map = new HashMap<>();

        for(int i = 0; i < 10; i++) {
            MemberVO mv = new MemberVO();
            mv = ms.getMemberByID("admin" + i + "@kh.com");
            map.put(i+1, mv);
        }
        return map;
    }   
}

除了@pathVariable 方法,一切正常。如果我在 rex 参数的末尾添加“/”,它也可以正常工作,但我听说这是一个危险的想法,因为它非常不可维护。另外,如果我不使用点变量作为 rex 参数(/{id} 而不是 /{id:.+}),它也可以正常工作。但我必须在这里使用电子邮件格式!

我正在使用 spring 5.0.6 和 最后 HTTP 响应是

 Status Report

Description The target resource does not have a current representation that would be acceptable to the user agent, according to the proactive negotiation header fields received in the request, and the server is unwilling to supply a default representation.

这是我在邮递员处执行时的标题

content-language →en
content-length →1175
content-type →text/html;charset=utf-8
date →Mon, 11 Jun 2018 09:00:04 GMT

对不起我的英语我几乎无法沟通。如果有人对此有想法,请帮忙!

更新

我在我的 root-context.xml 中配置了一些属性

<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="favorPathExtension" value="false"/>
    <property name="favorParameter" value="true"/>
    <property name="mediaTypes">
        <value>
            json=application/json
            xml=application/xml
        </value>
    </property>
</bean>

<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
    <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
    <property name="useSuffixPatternMatch" value="false"/>
    <property name="alwaysUseFullPath" value="true"></property>
</bean>

如果我在 regEx 变量的末尾添加 .json 或 .xml 但没有数据,现在它调用 200 ok..

【问题讨论】:

  • 查看答案下的 cmets 部分如何在不使用 regEx 的情况下覆盖。
  • 我配置了一些属性,现在它调用 200 ok!!但没有数据...我覆盖的是 contentNegotiationManager 和 handlerMapping。

标签: java spring spring-restcontroller path-variables


【解决方案1】:

尝试将路径变量定义为:

@PathVariable("id") String id

代替:

@PathVariable String id

【讨论】:

    【解决方案2】:

    在这些线上,

    @RequestMapping(value = "/member/{id:.+}", method = RequestMethod.GET) public MemberVO member(@PathVariable String id) {

    替换为,

    @RequestMapping(value = "/member/{id}", method = RequestMethod.GET) public MemberVO member(@PathVariable(value="id", required=true) String id) {

    【讨论】:

    • 感谢您的评论。我试过了,除非我添加特定的扩展名,例如 .json,.xml,否则它仍然无法正常工作,但它会抛出 200 ok tho。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2020-03-11
    • 2018-05-06
    • 2020-12-20
    • 2018-03-14
    相关资源
    最近更新 更多