Используя @pathvariable с @restController

В настоящее время я изучаю 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>

и теперь он вызывает 200 ok, если я добавляю .json или .xml в конец моей переменной regEx, но без данных ..

Возможный дубликат stackoverflow.com/a/3526973/1423818

mallikarjun 11.06.2018 11:26

Посмотрите в разделе комментариев под ответом, как переопределить без использования regEx.

mallikarjun 11.06.2018 11:27

Я настроил некоторые свойства, и теперь он вызывает 200 ОК !! но без данных ... я переопределяю contentNegotiationManager и handlerMapping.

I have 10 fingers 12.06.2018 02:55
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
2 564
2

Ответы 2

попробуйте определить переменную пути как:

@PathVariable("id") String id

вместо:

@PathVariable String id

В этой строке

@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.

I have 10 fingers 21.08.2018 12:11

Другие вопросы по теме